CMake找到了多个主要功能

the*_*oon 9 c++ boost cmake

我正在尝试编译一个只有一个main函数但又CMake找到更多函数的项目.

我的意思CMakeLists.txt是:

cmake_minimum_required(VERSION 2.8)
project(my_proj)

include_directories(".")

add_subdirectory(main)
add_subdirectory(resources)

find_package(OpenCV REQUIRED)
find_package(Boost REQUIRED COMPONENTS system regex program_options)
include_directories(${Boost_INCLUDE_DIRS})

file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE HDR_FILES ${PROJECT_SOURCE_DIR}/*.hpp)

add_executable(my_proj ${SRC_FILES} ${HDR_FILES})

target_link_libraries(my_proj ${OpenCV_LIBS})

target_link_libraries(my_proj ${OpenCV_LIBS} 
                  ${Boost_PROGRAM_OPTIONS_LIBRARY} 
                  ${Boost_REGEX_LIBRARY}
                  ${Boost_FILESYSTEM_LIBRARY}
                  ${Boost_SYSTEM_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

我有更多文件夹.hpp.cpp文件,这就是我添加file(GLOB_RECURSE...语句的原因include_directories(".").

编译所有文件后,我收到错误:

CMakeFiles/my_proj.dir/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp.o: In    function `main':
/media/N/my_proj/build/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp:209: multiple definition of `main'
CMakeFiles/my_proj.dir/main.cpp.o:/media/N/my_proj/main.cpp:10: first defined here
CMakeFiles/my_proj.dir/main/solution2/sources/CRunSolution2.cpp.o: In function `boost::filesystem3::path::codecvt()':
/usr/include/boost/filesystem/v3/path.hpp:377: undefined reference to `boost::filesystem3::path::wchar_t_codecvt_facet()'
Run Code Online (Sandbox Code Playgroud)

有没有人见过这样的东西?如果是的话,如何解决?

Pet*_*ter 23

在你的可执行文件,你只需有2个主要功能(打印出来SRC_FILESMESSAGE(${SRC_FILES})).一个是in main.cpp和one in CMakeCXXCompilerId.cpp(这是CMake生成的文件,用于测试您的CXX编译器是否正常工作).在GLOB_RECURSE可能发现,并增加了这两个文件,以SRC_FILES

使用FILE(GLOB ...)很棘手:

我们不建议使用GLOB从源树中收集源文件列表.如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时请求CMake重新生成.

您应该直接在CMakeLists.txt中列出源文件和头文件

  • +1'直接在您的CMakeLists.txt中列出您的源文件和头文件' (3认同)
  • 如果您将文件放在源代码控制中,则可以创建一个脚本来获取源代码管理中的所有cpp/h文件并将它们添加到您的应用程序中.我个人为我的CMake生成的项目做这个. (2认同)
  • 您应该使用单独的*binary*目录来构建项目.然后你应该能够在*source*目录上安全地使用globbing. (2认同)