【问题标题】:CMake's ctest: image not found (possible rpath issue)CMake 的 ctest:找不到图像(可能是 rpath 问题)
【发布时间】: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_testctest 运行测试是可能的,因为我可以成功运行 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_RPATHMACOSX_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


【解决方案1】:

如 cmets 中所述已解决,感谢 @Tsyvarev

指出问题原因的原始评论:

I can verify that 'libfoo.dylib' is in the same dir as the test program 'test_foo'. - 真的吗?您的可执行文件是在二叉树下创建的,那里有库吗?如果是这样,为什么将 TEST_DIR 用作工作目录或 RPATH,而它指向源代码树(测试子目录)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 2017-06-18
    • 2014-11-24
    • 2015-08-04
    • 2020-10-15
    • 1970-01-01
    • 2014-08-19
    • 2021-11-09
    相关资源
    最近更新 更多