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

方法1

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"

方法2
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

最佳答案

如果不使用-bundle,则在对dlopen()生成的共享库将无法再次使用dlclose()进行卸载。它会在整个过程中一直保留在内存中。 -bundle产生MH_BUNDLE类型的文件。

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

08-16 11:51