我有以下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* ....
答案 0 :(得分: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
目标的一部分),然后将链接到每个可执行文件。生成的二进制文件看起来几乎相同。根据所使用的编译器,由于此更改,您可能会失去一些优化,但通常仅提供可测量的性能下降是不够的。