【发布时间】:2021-10-11 15:13:11
【问题描述】:
我在使用 Google 测试时遇到了一个相当奇怪的问题。
在我的项目中,我使用externalProject_add 来下载谷歌测试并将它们添加到我的项目中。在我的功能中,我相信我要求构建项目,然后安装到特定目录中:
ExternalProject_Add(gTest_download
URL ${GTEST_url}
URL_HASH ${GTEST_hash}
UPDATE_COMMAND ""
BUILD_COMMAND cmake --build . --target install
CMAKE_CACHE_ARGS
-DCMAKE_C_COMPILER:PATH=${Compiler_C}
-DCMAKE_CXX_COMPILER:PATH=${Compiler_CXX}
-DBUILD_SHARED_LIBS:BOOL=ON
-DCMAKE_INSTALL_PREFIX:PATH=<BINARY_DIR>/installation
)
然后我可以告诉程序所有源文件都在哪里:
ExternalProject_Get_Property(gTest_download BINARY_DIR)
set(gTest_LIBRARY_DIR ${BINARY_DIR}/installation/lib CACHE INTERNAL "Google Test Binary Dir")
set(gTest_INCLUDE_DIR ${BINARY_DIR}/installation/include CACHE INTERNAL "Google Test Include Dir")
但是,当我尝试使用 protobufs 运行 cmake 测试时,出现运行时错误:
./Protobuf_test: error while loading shared libraries: libgmock.so.1.11.0: cannot open shared object file: No such file or directory
这太奇怪了,因为我知道我专门告诉程序在同一个 externalProject_add 文件中的哪里可以找到库:
set(gTest_LIBRARIES
${gTest_LIBRARY_DIR}/${prefix}gmock${suffix}
${gTest_LIBRARY_DIR}/${prefix}gmock_main${suffix}
${gTest_LIBRARY_DIR}/${prefix}gtest${suffix}
${gTest_LIBRARY_DIR}/${prefix}gtest_main${suffix}
CACHE INTERNAL "Google Test Libraries"
)
其中${prefix} 是“lib”,${suffix} 是“.lib”。我确保通过target_link_libraries(Protobuf_test ${gTest_LIBRARIES} ${protobuf_LIBRARIES}) ex:
CUSTOM_PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDS ${CMAKE_CURRENT_LIST_DIR} hello.proto)
include_directories(
${protoBuf_INCLUDE_DIR}
${gTest_INCLUDE_DIR}
${CMAKE_CURRENT_LIST_DIR}
)
add_executable(Protobuf_test protobuf_test.cc ${PROTO_SRCS} ${PROTO_HDS})
add_dependencies(Protobuf_test
gTest_download
protoBuf_download
)
target_link_libraries(Protobuf_test
${gTest_LIBRARIES}
${protoBuf_LIBRARIES}
)
add_test(NAME testing_protobuf COMMAND Protobuf_test)
所以我进入位于d/linuxBuild/lib/src/gTest_download-build/installation/lib 的安装文件夹并确认它存在于那里。然后我运行ldd libgmock.so 并得到以下输出:
libgtest.so.1.11.0 => not found
我也觉得很奇怪。 gtest 在同一目录中!这怎么可能?所以我在 gmock_main 上运行了 ldd:
libgmock.so.1.11.0 => not found
libgtest.so.1.11.0 => not found
所以现在我有两个库位于同一目录中,但是找不到它们。感到困惑的是,我决定去最初应该安装和复制库的地方。所以两个文件夹:d/linuxBuild/lib/src/gTest_download-build。然后我进入该文件夹的 lib 文件夹并验证库是否存在。然后我在 gmock 上运行相同的 ldd 命令:
libgtest.so.1.11.0 => /mnt/d/linuxBuild/lib/src/gTest_download-build/lib/libgtest.so.1.11.0 (0x00007fb651729000)
我对此感到困惑,再次在 gmock_main 上运行它:
libgmock.so.1.11.0 => /mnt/d/linuxBuild/lib/src/gTest_download-build/lib/libgmock.so.1.11.0 (0x00007f58b0db3000)
libgtest.so.1.11.0 => /mnt/d/linuxBuild/lib/src/gTest_download-build/lib/libgtest.so.1.11.0 (0x00007f58b0c9c000)
很抱歉这个冗长的问题,但我需要知道这里发生了什么?为什么当我安装库时,链接会相互断开,并且与原始安装路径中的位置相比,它们不知道它们的位置?他们的符号链接断开了吗?我在 CMake 构建中做错了什么吗?我在这个问题上摸不着头脑,因为我以前从未遇到过这个问题。任何建议将不胜感激。
【问题讨论】:
-
不是按要求回答您的问题,但
FetchContent()使用起来更简单,因为您只需执行target_link_libraries(target gmock_main)并让cmake 处理其他所有事情。 -
@Frank 有没有一个可靠的例子,你知道我可以看看?如果有更好的解决方案,我个人很乐意从 externalproject_add 继续前进。