问题

在MacOS上,我在运行时为依赖于动态链接资源的CMake项目获取链接问题 - 但仅在安装项目之后!当我只构建二进制文件而不安装它时,不会发生这个问题。

$ ./testapp

Hello world!

$ $INSTALLDIR/testapp

dyld: Library not loaded: @rpath/libvtkDomainsChemistryOpenGL2-7.1.1.dylib

Referenced from: /Users/normanius/workspace/installdir/testapp

Reason: image not found

[1] 76964 trace trap /Users/normanius/workspace/installdir/testapp

最小的例子

我能够在由CMakeLists.txt和main.cpp组成的最小设置中重现问题。我链接的库名为VTK(v7.1.1),它是使用共享库构建的(有关详细信息,请参见下文)。

# CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(test)

# Test application.

add_executable(testapp

main.cpp)

# Find vtk (library that has to be linked to dynamically).

find_package(VTK REQUIRED)

include(${VTK_USE_FILE})

target_link_libraries(testapp ${VTK_LIBRARIES}) #

# Install instructions.

install(TARGETS testapp DESTINATION "${CMAKE_INSTALL_PREFIX}")

main.cpp甚至没有使用任何VTK对象。

// main.cpp

#include

int main (int argc, char* argv[])

{

std::cout << "Hello world!" << std::endl;

return 0;

}

我使用以下命令构建项目。标志CMAKE_PREFIX_PATH我设置给CMake一个关于在哪里找到VTK库的提示。

$ INSTALLDIR="path/to/installation"

$ mkdir build && cd build

$ cmake .. -DCMAKE_PREFIX_PATH="$DEVPATH/lib/vtk/cmake" \

-DCMAKE_BUILD_TYPE=Release \

-DCMAKE_INSTALL_PREFIX="$INSTALLDIR"

$ make

$ make install

在build文件夹中执行testapp时,一切看起来都很好:

$ ./testapp

Hello world!

$ cp testapp $INSTALLDIR/testapp

$ $INSTALLDIR/testapp

Hello world!

但是,如果我在INSTALLDIR中运行可执行文件,我会收到运行时错误:

$ $INSTALLDIR/testapp

dyld: Library not loaded: @rpath/libvtkDomainsChemistryOpenGL2-7.1.1.dylib

Referenced from: /Users/normanius/workspace/installdir/testapp

Reason: image not found

[1] 76964 trace trap /Users/normanius/workspace/installdir/testapp

当然,如果我删除target_link_libraries()中的CMakeLists.txt指令,问题就会消失。

那么安装CMake项目到底发生了什么?我的情况出了什么问题?我测试了不同的CMake版本(3.5,3.9和3.10) - 但行为是一样的。

细节

显然,MacOS上的RPATH机制没有为该示例正确设置。

这是testapp二进制文件的链接结构的摘录:

$ otool -L testapp

testapp:

@rpath/libvtkDomainsChemistryOpenGL2-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0)

@rpath/libvtkFiltersFlowPaths-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0)

@rpath/libvtkFiltersGeneric-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0)

@rpath/libvtkFiltersHyperTree-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0)

...

因为它可能起到如何构建VTK库(另一个CMake项目)的作用:对于python支持,必须设置项目标志VTK_WRAP_PYTHON=ON和BUILD_SHARED_LIBS=ON。安装前缀设置为CMAKE_INSTALL_PREFIX="$VTK_INSTALL_DIR"。为了确保在运行时找到资源,还必须通过CMAKE_MACOSX_RPATH=ON和CMAKE_INSTALL_RPATH="$VTK_INSTALL_DIR/lib"启用RPATH支持。

包起来

我在概念上会出错什么?使用make install安装项目时会发生什么?可以在CMake中解决这个问题吗?或者它只与VTK以及共享库的构建方式有关?

cmake中添加引用动态链接_macos - CMake:MacOS上动态链接资源的运行时错误(dyld:未加载库) - SO中文参考 - www.soinside.com...相关推荐

  1. cmake中添加引用动态链接_CMake 添加头文件目录,链接动态、静态库(添加子文件夹)...

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  2. cmake中添加引用动态链接_C# 添加、编辑、删除PPT中的超链接

    本文介绍通过C# 编程在PPT幻灯片中添加超链接(包括给文本添加超链接.给图片添加超链接)的方法,以及编辑.删除幻灯片中已有的超链接. 程序使用类库:Free Spire.Presentation f ...

  3. php替换时 css中的图片不显示不出来,URL重写:CSS,JS和图像未加载

    我遵循规则 .htaccess Options +FollowSymLinks RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAM ...

  4. coverage 覆盖多个测试文件时_奇技淫巧[2]:cmake中添加lcov代码覆盖测试

    奇技淫巧[2]:cmake中添加lcov代码覆盖测试 1 目的 为CMake工程的test添加lcov代码覆盖性测试 2 要点 添加lcov支持的方法应该有很多,比较方便的有: (1)利用脚本基于文件 ...

  5. 静态链接库、动态链接库和动态加载库

    前言 静态库是obj文件的一个集合(目标文件中通常仅解析了文件内部的变量和函数,对于引用的函数和变量还没有解析,这需要将其他已经编写好的目标文件引用进来,将没有解析的函数和变量进行解析,通常引用的目标 ...

  6. Metrics_collector还没有添加到共享预加载库(shared_preload_libraries)中

    gpcc踩坑 本文最大的锅,最大的坑来了 安装完成之后会报以下错误!你可以完全忽略错误的解决过程直接跳到最后! Metrics_collector还没有添加到共享预加载库(shared_preload ...

  7. Linux下的静态库、动态库和动态加载库

    from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...

  8. 用Assimp模型加载库加载一个Crytek的游戏孤岛危机(Crysis)中的原版纳米装(Nanosuit)

    用这个例子来对GitHub上的LearnOpenGL教程前四个单元用到的所有自定义或者引入的各种头文件和资源进行一个总结,不得不说这个教程简直太美妙了. 这个模型是来自对GitHub上的LearnOp ...

  9. Html未加载完成时实现动态加载效果

    在html页面未加载完成时会有一段空白,增强用户体验的话,必须在未加载完成时实现动态效果 效果如下: 1.一个普通html页面,内容如下 <html> <head> <s ...

最新文章

  1. 人脸检测--Scale-Aware Face Detection
  2. 分分钟掌握设计基本原则
  3. typecast java_Java中的类型转换
  4. FreeMarker学习
  5. hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  6. P2494 [SDOI2011]保密(网络流/最小割/01分数规划)
  7. VMware中linux硬盘空间不足的解决方法
  8. 达梦数据库查看某个表的字段类型、常用数据库驱动类名以及URL
  9. Rxjava2+Retrofit2结合使用
  10. 【贪心+双指针】LeetCode 11. Container With Most Water
  11. C++11:原子交换函数compare_exchange_strong
  12. Python词频统计
  13. win10无法连接wifi_更新WIN10 1903遇到旧版高通驱动无法连接WIFI重新安装网卡驱动...
  14. 计算机桌面文件为何不能剪贴,电脑不能复制粘贴是什么原因【方法介绍】
  15. hexo+yilia添加百度统计和Google统计
  16. 【房屋销售系统——开题报告 分享(仅供参考呀)】
  17. 智能世代的工业/嵌入式网络与I/O桥接芯片解决方案
  18. 安卓机更新系统会卡吗_安卓手机系统会不会越更新越卡?
  19. 莱诺和柯南Excel甘特图
  20. 苹果个人公司类型开发者账号申请(99美元)详解

热门文章

  1. 泛型缓存(Generic)
  2. NLP基础学习4--tfidf和互信息
  3. mac os 下Nginx+PHP环境配置
  4. 阿里巴巴开源组件Easy Excel的Excel导入导出
  5. 想知道法院司法警务“六专四室”规范建设是指的什么?
  6. 没有运维的公司,如何选择服务器?公司一定需要运维吗?
  7. edge 此项内容已下载并添加到 Chrome 中。_微信认怂,将推出暗黑模式;2345 旗下下载站被发现传播木马...
  8. 2023年【煤气】考试报名及煤气证考试
  9. PDF 破解软件注册码
  10. 亚商投资顾问 早餐FM/0920 苹果涨2.51%,领涨道指