【发布时间】:2017-12-14 13:38:32
【问题描述】:
CMake 项目在 Linux 和 Windows 上构建和运行测试正常,但在 macOS 上运行测试程序失败。
dyld: Library not loaded: libfoo.dylib
Referenced from: /some/path/test_foo
Reason: image not found
我可以验证libfoo.dylib 与测试程序test_foo 在同一个目录中。运行 ./test_foo 工作正常。
CMake 通过ctest(位于另一条路径)调用test_foo。由ctest 调用似乎是它失败的原因,但如果我尝试这样的命令(工作目录为/some/path)它可以工作:
DYLD_LIBRARY_PATH=`pwd` /another/path/ctest
我假设在不设置 DYLD_LIBRARY_PATH 的情况下使用 add_test 和 ctest 运行测试是可能的,因为我可以成功运行 test_foo,但我没有运气。
这里是当前CMakeLists.txt的相关内容
set(TEST_LIBS foo)
set(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests)
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
add_executable(test_foo tests/testfoo.cpp)
set_target_properties(test_foo PROPERTIES COMPILE_FLAGS "-DSELF_TEST")
target_link_libraries(test_foo ${TEST_LIBS} ${STUFF})
add_dependencies(build_tests test_foo)
add_test(NAME test_foo COMMAND $<TARGET_FILE:test_foo>
WORKING_DIRECTORY ${TEST_DIR})
- 我已尝试在这些行之前设置/取消设置
CMAKE_MACOSX_RPATH和MACOSX_RPATH,建议 here: -
按照here 的建议,我已尝试在行后添加以下 sn-p:
IF(APPLE) SET(CMAKE_INSTALL_NAME_DIR ${TEST_DIR}) SET(CMAKE_BUILD_WITH_INSTALL_RPATH ON) ENDIF(APPLE) 我没有尝试过using
install,我不确定如何为我的项目配置它,甚至不知道它的作用。
这里有任何已知的方法或任何明显的错误吗? install 值得一看吗?我希望能够从 Makefile 中 CMake 生成的 ctest 行运行测试。
CMake 3.5.2、macOS 10.12.5
【问题讨论】:
-
您的项目在调用
cmake_minimum_required()时设置了什么CMake 版本?此命令不仅设置最低 CMake 版本,还设置 CMake 的行为以匹配该版本。您是否偶然指定了旧版本(即 -
I can verify that 'libfoo.dylib' is in the same dir as the test program 'test_foo'.- 真的吗?您的可执行文件是在 binary 树下创建的,那里有库吗?如果是这样,您为什么使用TEST_DIR作为工作目录或 RPATH,而它指向 source 树(tests子目录)? -
@CraigScott 我明天试试,谢谢你的建议
-
@Tsyvarev libfoo.dylib 和 test_foo 都在同一个目录中,我可以说。我没有创建 cmake 文件,我认为出于调试目的,将一些源文件复制到二叉树中,但是是的,源树在别处。更好地理解这个过程对我有好处,明天我将在我可以访问 Mac 后验证这一点。
-
@CraigScott 虽然我确实有 2.6 的 cmake_minimum_version,但将其更改为 3.5 似乎并没有解决这个问题。
标签: c++ macos unix build cmake