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就可以了。