背景:
c工程使用cmake编译,明明工程之中只有一个mian函数,但是编译报错提示multiple definition of `main',出现该问题是因为使用了cmake指令file(GLOB_RECURSE 文件名集合变量 文件路径),在cmake编译中,使用GLOB_RECURSE宏,会递归遍历所有符合条件的文件,cmake编译生成的文件也会被搜索纳入文件名集合中,导致main重复定义问题。
file(GLOB_RECURSE DEVICE_C ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
解决方法1:去掉GLOB_RECURSE,改为GLOB,此方法将不能遍历子文件夹,如果工程庞大且代码目录结构复杂,需要逐个追加源代码目录,cmake文件编写相对复杂。
解决方法2:从文件名集合中剔除cmake编译生成的文件名
list(REMOVE_ITEM DEVICE ${REMOVE_CMAKE})表示将REMOVE_CMAKE从DEVICE文件名集合中剔除
其中build目录存放cmake编译生成的一些列文件;DEVICE_C是文件名集合变量;
file(GLOB_RECURSE DEVICE_C ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
#file(GLOB DEVICE_H ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
list(APPEND DEVICE ${DEVICE_H} ${DEVICE_C})
#remove file of ${CMAKE_CURRENT_SOURCE_DIR}/build
file(GLOB_RECURSE REMOVE_CMAKE "${CMAKE_CURRENT_SOURCE_DIR}/build/*")
list(REMOVE_ITEM DEVICE ${REMOVE_CMAKE})