0

次の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 ファイルがすべての add_executable に対して ${info_model} からソースをビルドすることです (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* ....
4

1 に答える 1

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) 1 回だけコンパイルされ、その後、各実行可能ファイルにリンクされます。結果のバイナリはほとんど同じに見えます。使用するコンパイラによっては、この変更により一部の最適化が失われる可能性がありますが、通常、パフォーマンスが大幅に低下するほどではありません。

于 2013-08-16T12:43:53.763 に答える