Mac OS X (10.9.1)下创建和使用动态链接库的方法
2015-02-05 14:05
253 查看
比如有
a.c,a.h;
b.c,b.h;
c.c,c.h;
首先编译到对象文件:
gcc -fPIC -c a.c b.c c.c
生成了
a.o,b.o,c.o
如果要打包成静态库 libtest.a:
ar -r libtest.a a.o b.o c.o
然后我在另一个目录下有一个main.c编译链接这个libtest.a是可以的。
现在我要弄成动态库 libtest.dylib:
gcc -fPIC -dynamiclib a.o b.o c.o -o libtest.dylib
我发现编译成libtest.so也一样:
gcc -fPIC -shared a.o b.o c.o -o libtest.so
然后我复制到/usr/lib下,然后修改了所有者和用户组:
chown root:wheel libtest.dylib
到另一个目录下的main.c,我已经复制过来了头文件,然后我编译main.c时来链接这个动态库,应该是不用指定 -L的:
gcc main.c -ltest -o main -fPIC
这时我发现提示找不到lib:ld: library not found for -ltest。
那我想就指定一下库的搜索路径吧:
gcc main.c -L/usr/lib/. -ltest -o main -fPIC
一样的错误。
然后我就干脆指定这个文件吧:
gcc main.c /usr/lib/libtest.dylib -o main -fPIC
这个到可以了,然后运行./main也可以;
我想要是放其他目录呢:
gcc main.c -L/Users/reynoldqin/Desktop/. -ltest -o main -fPIC
这样在编译的时候成功了,但是运行./main的时候又提示:
dyld: Library not loaded: libtest.dylib
Reason: image not found
这时如果我把libtest.dylib又复制一份放到/usr/lib下,运行./main却有可以了。
后来我发现原来还有一个动态库目录,然后我就把他放到
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
我直接使用动态库编译,不指定-L:
gcc main.c -ltest -o main -fPIC
编译成功了,但是运行./main 一样提示找不到,我还是得在/usr/lib下放一份才可以运行;
无论是libtest.dylib还是libtest.so,上面都是一样的。
上面就是我测试了一圈的过程:
* libtest.dylib放在/usr/lib貌似不是用来编译的,只是运行的时候需要;
* /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib 这个目录是可以作为动态库目录来编译的,但是运行时怎么又需要在/usr/lib;
所以我就搞不清楚了,既然叫动态库的话,我应该只要把库文件放在/usr/lib 就可以直接链接了吧。请问这是怎么回事呢?我还没有在linux下试过的。
你otool -L看一下main和libtest.dylib的install-name, 默认的第三方库的路径是/usr/local/lib... |
@hewigovens 我放那里后编译main的时候也找不到啊 |
现在常见做法都是使用相对路径, 比如QQ, @executable_path/../Frameworks/xp_macosx.framework/Versions/A/xp_macosx Mac的做法是把link的库都写入了binary里, 然后有个install_name_tool可以修改, 当然你用xcode工程创建dylib是可以配置的, 具体可以看Apple的文档: http://developer.apple.com/documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html |
前段时间项目用到了ffmpeg研究过,使用就是两步工作 1.使用otool -L 查看路径 2.install_name_tool -change 命令去修改那些路径是/usr/local/lib的,需要先把的dylib都copy到目录里面 |
相关文章推荐
- Mac OS X 系统下快速显示隐藏文件的方法(使用Automator创建workflow)
- MAC OS X无法使用ADB的解决方法
- Android逆向工程工具Dare的使用方法(Mac OS X中)
- 在更新 Mac OS X EI Capitain之后Xcode7使用CocoaPods不工作的解决方法
- Mac下创建和使用动态链接库 C++
- mac os x 使用zsh终端后,django-admin命令失效解决方法
- ubuntu和mac OS X下另一种使用QQ的方法
- Mac OS X 下安装使用 Docker(旧方法,但有助于理解一些理论)
- mac OS X系统使用方法
- mac系统下使用beego工具创建项目出现kill -9 解决方法
- Mac创建Win7安装盘图文教程 OS X 10.11上使用Bootcamp创建Win7安装盘的方法
- ubuntu和mac OS X下另一种使用QQ的方法
- 在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )
- Mac OS X中WireShark的使用,及找不到网卡问题的解决方法
- Mac OS X 使用 rc.local 开机执行命令设置方法
- 苹果系统MAC OS X使用windows文件服务器、samba文件服务器的方法
- 关于小米等山寨机在Macosx上没法使用的adb的解决方法
- Mac OS X升级到10.11之后不能使用pod的问题解决方法
- mac 使用MyEclipse时遇到无法创建web项目问题解决方法
- 关于MAC上使用pycharm进行创建project的方法