cmake编译报错:
[build] main.cxx.obj : error LNK2005: main 已经在 CMakeCXXCompilerId.cpp.obj 中定义
[build] J:\WorkSpace\VisualStudioCode\SC510N1.QT\bin\SC510N1_QT.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
[build] ninja: build stopped: subcommand failed.
问题出在cmake工程的目录结构和file命令的选项没有配合好,工程中用了如下命令查找目录中的所有cpp文件:
file(GLOB_RECURSE CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
用vscode编译时,cmake会将config产生的中间文件保存在自动生成的build目录下,这些文件中也有后缀是.h和.cpp的,其中就有一个叫CMakeCXXCompilerId.cpp,它里有一个cmake自动生成的main函数。我们自己写的代码里也有一个main函数。上述指令使用了GLOB_RECURSE选项,会在当前目录递归查找所有后缀名为.cpp的源文件,然后就会找到两个包含main函数的cpp文件拿去编译。再然后就报错了。。。。。
解决办法:
知道了报错的原因,那解决方法就很简单了,只需要让file命令在查找源文件的时候不要查找build目录即可:
查找根目录的源文件时不使用递归查找选项,只使用GLOB 选项
file(GLOB CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
查找子目录时再使用递归查找选项
file(GLOB_RECURSE CPP_FILES
${CMAKE_CURRENT_SOURCE_DIR}/subDir1
${CMAKE_CURRENT_SOURCE_DIR}/subDir2
*.cpp
)