【问题标题】:multiple source building in cmakecmake中的多源代码构建
【发布时间】:2013-08-18 18:50:58
【问题描述】:

我有以下 cmake 文件

cmake_minimum_required(VERSION 2.6)

# Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

include_directories(../src/gcc_xml_parsing)

file(GLOB info_model

"../src/info_model/*.h"
"../src/info_model/*.cpp"
"../src/gcc_xml_parsing/*.h"
"../src/gcc_xml_parsing/*.cpp"
"../src/messages_filed_with_values/*.h"
"../src/messages_filed_with_values/*.cpp"

)

# Link runTests with what we want to test and the GTest and pthread library

add_executable(runTests_xml unit/gcc_xml_parsing/ut_XMLFile.cpp ${info_model} )
add_executable(runTests_hexDumpUtil unit/info_model/ut_HexDumpUtil.cpp ${info_model} )
add_executable(runTests_cstruct  unit/info_model/ut_CStruct.cpp ${info_model})
add_executable(runTests_primitive_type_field unit/info_model  /ut_PrimitiveTypeField.cpp    ${info_model})
add_executable(runTests_enumField unit/info_model/ut_EnumField.cpp ${info_model})
add_executable(runTests_ArrayOfFields unit/info_model/ut_ArrayType.cpp ${info_model})

target_link_libraries(runTests_xml ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread  boost_regex)
target_link_libraries(runTests_hexDumpUtil ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread boost_regex )
target_link_libraries(runTests_cstruct ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread boost_regex )
target_link_libraries(runTests_primitive_type_field ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread boost_regex )
target_link_libraries(runTests_enumField ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread boost_regex )
target_link_libraries(runTests_ArrayOfFields ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread boost_regex )

一般来说,在制作并运行 MakeFile 后,程序编译良好。问题是,make 文件从 ${info_model} 为每个 add_executable 构建源(makefile 正在为每个可执行文件构建所有 *.o 文件。如何修复它?谢谢。

编辑: 在我的 cmake 中进行更改后(根据这篇文章中的第一个答案),我的应用程序编译良好,但存在链接问题。整个日志很大,所以我只粘贴第一部分:

Linking CXX executable runTests_ArrayOfFields
libinfo_model_lib.a(XMLFile.cpp.o): In function `bool   boost::regex_search<__gnu_cxx::__normal_iterator<char const*, std::string>,   std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const* ....

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您可以将这些文件移动到静态库中:

    add_library(info_model_lib STATIC ${info_model})
    
    add_executable(runTests_xml unit/gcc_xml_parsing/ut_XMLFile.cpp)
    [...]
    
    target_link_libraries(runTests_xml ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread  boost_regex info_model_lib)
    [...]
    

    这样,源文件将只编译一次(作为构建info_model_lib 目标的一部分),然后将链接到每个可执行文件。生成的二进制文件看起来几乎相同。根据所使用的编译器,您可能会因为此更改而失去一些优化,但通常这不足以显着降低性能。

    【讨论】:

    • 您好,我已经更新了我的cmake,但在链接过程中仍然有问题。请看我上面的编辑。谢谢
    • @friko 这是一个不同且不相关的问题。您应该创建一个新问题,详细描述链接器问题。此外,您提供的错误消息已被截断,因此无法查看实际缺少哪个符号。
    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 2018-02-22
    • 2021-01-31
    • 2020-12-09
    • 2015-11-07
    • 2016-08-14
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多