【问题标题】:CMake test does not find library on MacOSCMake 测试在 MacOS 上找不到库
【发布时间】:2018-08-10 19:17:50
【问题描述】:

我有一个带有单元测试的简单库。该库可以构建为静态链接库或动态库。该库适用于 Windows、Linux 和 MacOS。

该库正在使用 CMake(带有 Qt)并具有 ctest 单元测试。

这是构建库和调用单元测试的方式:

cmake -DCMAKE_BUILD_TYPE=Debug path/to/sources
cmake --build . --target all
cmake --build . --target test

除 MacOS 外,一切正常。当构建库是动态链接库时,单元测试找不到库。

    Start 110: UnitTest
110/119 Test #110: UnitTest.................***Exception: Child aborted  0.01 sec
dyld: Library not loaded: library.dylib
  Referenced from: /tmp/build/bin/UnitTest
  Reason: image not found

直接调用 ctest 或直接调用可执行文件可以正常工作。只有从cmake调用测试目标时,单元测试可执行文件才找不到库。

将 DYLD_LIBRARY_PATH 设置为库的位置没有帮助。 我使用 install_name_tool 将库的路径更改为绝对路径,从而解决了问题。 但是,这只是问题的一个指标,而不是解决方案。

我怀疑 cmake 在调用测试目标时会更改 DYLD_LIBRARY_PATH。这是真的?这应该如何工作?

【问题讨论】:

    标签: c++ macos cmake dylib


    【解决方案1】:

    我怀疑 cmake 在调用测试目标时会更改 DYLD_LIBRARY_PATH。这是真的吗?

    事实上,ctest 用于执行您之前在CMakeLists.txt 中描述的测试,而cmake 或ctest 都不会更新DYLD_LIBRARY_PATH 环境变量。

    也就是说,如果您想将特定测试与某个环境变量相关联,您可以通过设置 ENVIRONMENT 测试属性来实现。例如:

    set_property(TEST ${name} PROPERTY ENVIRONMENT "DYLD_LIBRARY_PATH=/path/to/foo")
    

    为了更好地解决您的问题,我建议您执行以下操作:

    • 指明使用的 CMake 二进制文件的版本
    • 如果可能,请提供一个小示例,以便重现问题
    • 分享这两个命令的输出:
      • (1)ldd /tmp/build/bin/UnitTest
      • (2)otool -l /tmp/build/bin/UnitTest | grep -A 3 LC_RPATH | grep path

    附带说明,考虑指定传递给 cmake 的参数类型,首选-DCMAKE_BUILD_TYPE:STRING=Debug 而不是-DCMAKE_BUILD_TYPE=Debug。

    【讨论】:

      猜你喜欢
      • 2018-10-19
      • 1970-01-01
      • 2022-07-23
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      相关资源
      最近更新 更多