【问题标题】:CMake finds more than one main functionCMake 发现不止一个 main 函数
【发布时间】:2014-04-06 06:48:09
【问题描述】:

我正在尝试编译一个只有一个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})

我有更多包含.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()'

有没有人遇到过这样的事情?如果是,如何解决?

【问题讨论】:

    标签: c++ boost cmake


    【解决方案1】:

    在您的可执行文件中,您只需拥有 2 个主要功能(由MESSAGE(${SRC_FILES}) 打印出SRC_FILES)。一个在main.cpp 中,一个在CMakeCXXCompilerId.cpp 中(这是CMake 生成的一个文件,用于测试您的CXX 编译器是否正常工作)。 GLOB_RECURSE 可能会找到这两个文件并将其添加到 SRC_FILES

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

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

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

    【讨论】:

    • +1 for '直接在 CMakeLists.txt 中列出源文件和头文件'
    • 如果您的文件在源代码控制中,您可以创建一个脚本来获取源代码控制中的所有 cpp/h 文件并将它们添加到您的应用程序中。我个人为 CMake 生成的项目执行此操作。
    • 您应该使用一个单独的 binary 目录来构建您的项目。然后你应该能够安全地在你的 source 目录上使用 globbing。
    • @thedarksideofthemoon:如果你正在考虑学习它的方法,恐怕没有关于它的文章。不过,我可以与您分享代码的相关部分。这是我如何在我的 Git 存储库上更新 CMake 文件的粘贴(免责声明 - 部分脚本可能丢失。但希望你能明白):gist.github.com/ViteFalcon/a77c1c135304f5afce53
    • @JohannesS。谢谢,但是通配是经常重构项目的方式,手动编辑数百个目标非常乏味
    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2021-08-19
    • 2013-08-09
    • 2011-01-16
    • 2021-06-30
    相关资源
    最近更新 更多