如何用gcc编译生成动态链接库*.so文件

如何用gcc编译生成动态链接库*.so文件,第1张

生成动态链接库的命令行为:

gcc -fPIC -shared -o libstr.so

当将main.c和动态链接库进行连接生成可执行文件 的命令如下:

gcc main.c -L./ -lstr -o main或者gcc -o main main.c -L./ -lstr

测试是否动态链接,如果列出libstr.so, 那么应该是连接正常了ldd main注:1)-L.:表示连接的库在当前的目录中。

创建动态链接库:

1、生成module文件,也就是.o文件。这跟一般的Linux没什么区别。

cc -c a.c b.c 就得到a.o和b.o

2、用ld来合并.o文件

ld -r -o c.o a.o b.o 这个也没什么特别。

3、用libtool来创建动态链接库。

libtool -dynamic -o c.dylib a.o b.o ( 这里也可以用libtool -static -o c.a a.o b.o就创建静态库)

如果用gcc直接编译,linux下一般是:

gcc -shared -o c.so a.c b.c

而在Mac OS X下需要:

gcc -dynamiclib -o c.dylib a.c b.c

这往往也是向Mac OS X移植unix程序常出问题的地方。如果用autoconf/automake等工具,出错的几率应该小一些。

访问动态链接库:

1、nm是最常用的,这个用法跟linux下差不多

nm c.dylib 可以看到导出符号表,等等。

2、另一个常用的工具是otool,这个是Mac OS X独有的。比如想看看c.dylib的依赖关系

otool -L c.dylib

对Framework的理解:

Framework是Mac OS X下必不可少的部分,不妨去看看/System/Library/Frameworks/下面,一大堆Framework。Framework是dylib的进一步演化,它把头文件、文档、动态链接库等整合成一个有机的目录,类似一种自描述的方式,这种做法其实在Mac OS X下随处可见。比如应用程序,一般都是一个目录,譬如/Applications/iTunes.app目录对应应用程序iTunes,双击这个目录即开始执行。这种做法和Windows下常见的一个exe/dll打天下很不相同。

Framework的创建工具也是libtool,详细用法参考man。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

这里介绍一下怎么开发最简单的Cocoa程序,这个程序实在是太简单,因为如果你用Xcode的话,选用Cocoa Foundation Command Tool的话,应该不用写任何代码, 但是这里是为了向大家介绍一下,这个最简单的程序是如何通过gcc编译成功的,当然里面还有一个东西可以做一点解释.

先看看源代码:

#import <Foundation/Foundation.h>

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

{

NSLog(@"Hello Cocoa From Console")

return 0

}

代码很简单,你可以用你喜欢的任何文本编辑工具来完成它, 源码文件名为hello.m, 这样简单的一个程序用xcode的话就太奢侈了.

ok,下面来看看怎么编译这个程序, 打开终端, cd 到源文件所在的目录,然后执行下面的这个命令,就可以生成一个叫做hello的程序了.

gcc -framework Foundation hello.m -o hello

这里面需要解释的是 -framework 参数, 熟悉gcc的朋友可能知道,gcc中的-l参数其实是传递给ld命令的,是用于链接器工作的, mac下面的-framework和-l参数的效果是一样的,就是告诉ld编译后的目标文件在生成最终的执行文件的时候,要连接哪个framework, 因为mac的核心Darwin也是一个unix,所以在Mac下面-l参数也是被支持的.

另外还有一点, gcc还可以接受-L来指定要连接的library在什么位置,这个选项一般用来连接第三方的库, 那么如果我想连接第三方的Framework的时候,我应该怎么做呢? -L /your/Framework? 不对, gcc针对这种情况使用了另外一个参数 -F, 所以如果你要连接第三方的framework, 比如/opt/Qt4/QtCore, 你应该像下面这样使用gcc.

gcc -F/opt/Qt4 -framework QtCore qttest.cpp -o qttest

好了,现在继续来解释上面那个程序里面的另一个问题,为什么字符串的前面多了个@符号呢?想必这个东西也困扰了不少人, 在obj-c里面@"string"这种模式在编译的时候会被编译器进行一个转换,生成一个NSString指针的实例,所以在需要NSString指针作为参数的地方,如果你不想明确的构造这个NSString指针, 那么用这种方法就最简单了,但是如果你将@"String"模式用在了需要c string的地方,就要出现错误了。

Note:

因为obj-c都是用指针 *** 作的,用"字符串"这样表示的c string,明显compiler是不知道这个"字符串"的地址应该放在在哪里。前面加个at,那么@"字符串"的意思基本上是new一个叫做"字符串"的NSString,并且返回这个NSString的地址。

所以

NSLog("Hello Cocoa From Console")

这样就会出错,

NSLog(@"Hello Cocoa From Console")

这样就没问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11890491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存