mac xos系统写程序出如下错: dyld: Library not loaded

mac xos系统写程序出如下错:


dyld: Library not loaded:



我的目录下有如下几个文件,编译生成main


SConstruct fun1.cpp   fun1.h     fun1.o     main       main.cpp   main.o


如下所示,执行main,报找不到动态库libfun2.dylib

./main

dyld: Library not loaded: libfun2.dylib

  Referenced from: /Users/vi/job/learn_scons/main/./main

  Reason: image not found

Trace/BPT trap: 5


我们执行如下命令,查看main依赖:

otool -L main

main:

libfun2.dylib (compatibility version 0.0.0, current version 0.0.0)

/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)




libfun2.dylib在上层目录lib2目录下面:

CMakeLists.txt build          lib2.h         libfun2.dylib

SConstruct     lib2.cpp       lib2.os


我们执行如下命令,查看libfun2.dylib依赖:

otool -L libfun2.dylib 

libfun2.dylib:

libfun2.dylib (compatibility version 0.0.0, current version 0.0.0)

/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)



在互联网上找不少资料,大体有两种方法来解决这个问题:

1:通过install_name_tool 来修改main程序对库libfun2.dylib的依赖路径,如下:

install_name_tool -change libfun2.dylib ~/job/learn_scons/lib2/libfun2.dylib ./main

在这里库libfun2.dylib前面的路径~/job/learn_scons/lib2/是绝对路径,也可是相对当前的路径 ,只不过如果是使用相对路径,那么当执行main时,会按你执行main时所在的当前路径去寻找,一但你此时执行main的当前路径和你设置时所用的当前路径不相等(注意这里没有用一致,因为只要是相对就可以了),就会找不到libfun2.dylib

2:相对上第1种方法,只要main被重编译了,那么,main加载libfun2.dylib的路径又会失效,查找资料发现,在编译 main时,链接器是能过libfun2.dylib本身所带的路信息进行生成main的。所以otool -L libfun2.dylib 会发现libfun2.dylib就是没有路径的。才导致了main所依赖的libfun2.dylib也没有路径。因此,我们要解决这个问题,我们只要在生成libfun2.dylib时,把它的路径加进去就行了。

[100%] Linking CXX shared library liblib2.dylib

/usr/local/Cellar/cmake/3.4.1/bin/cmake -E cmake_link_script CMakeFiles/lib2.dir/link.txt --verbose=A

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -dynamiclib -Wl,-headerpad_max_install_names  -o liblib2.dylib -install_name /Users/vi/job/libtest/lib2/build/liblib2.dylib CMakeFiles/lib2.dir/lib2.cpp.o  -L/usr/local/lib 

[100%] Built target lib2

如上面的蓝色字体所示:只要加上-install_name /Users/vi/job/libtest/lib2/build/liblib2.dylib就可以了。

再用otool工具看一下路径:

otool -L liblib2.dylib 

liblib2.dylib:

/Users/vi/job/libtest/lib2/build/liblib2.dylib (compatibility version 0.0.0, current version 0.0.0)

/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)


好了,到此问题就解决了。再编译main就可以了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值