4

我有一个名为 abc 的小型 C 程序,它在内部使用 dlopen 来动态加载和运行共享库 libabc。libabc 声明了一个在运行时动态加载和调用的函数 greeting。当我使用以下两种方法编译和运行时,结果是一样的。创建共享对象 (.so) C 库时,GCC 编译器上的 -shared 和 -bundle 标志有什么区别?

方法一

cc -c libabc.c -o libabc.o
cc **-shared** -o libabc.so libabc.o
cc -Wall -g abc.c -ldl -o abc
./abc ./libabc.so greeting "Hello World"

方法二

cc -c libabc.c -o libabc.o
cc **-bundle** -o libabc.so libabc.o
cc -Wall -g abc.c -ldl -o abc
./abc ./libabc.so greeting "Hello World"

使用达尔文 gcc 4.2

4

1 回答 1

4

如果你不使用-bundle,生成的共享对象在你 dlopen() 之后不能再用 dlclose() 卸载;它将在整个过程的生命周期中保留在内存中。-bundle生成 MH_BUNDLE 类型的文件。

顺便说一句,捆绑包的推荐(但不是强制性)扩展名是.bundle,而不是.so.

于 2012-12-11T13:16:44.337 回答