2010-10-17 92 views
6

我正在写一个使用dlopen()(Windows上的LoadLibrary())来动态加载共享库的可执行文件。共享库使用可执行文件中的符号。Mac:如何从可执行文件导出符号?

在Windows中,这是可能的。可执行文件可以导出符号:declspec(dllexport)和.def文件都可以使用。链接器在创建.exe时还会创建.lib文件(“导入库”),因此该DLL只需与该.lib链接即可。

在Linux中,这也是可能的。构建可执行文件时,我传递-Wl,-export_dynamic,以便导出它的符号。

在Mac OS X,而不是...轮候册,-export_dynamic不起作用,但轮候册,-exported_symbols_list,<filename>其中<filename>是符号导出列表(排序的一个简化版本.def文件)。但是,建立共享库并不容易:链接器抱怨未解决的符号。

我试过一个黑客:将可执行文件重命名为lib <executable> .dylib,并且在链接共享库时,我通过了-l <executable>。但它给出的错误“无法与主可执行文件链接”。

一般问题是Linux共享库可能有未解析的符号,而Windows和Mac OS X不允许它。但Windows有“导入库”来解决依赖关系的符号,而Mac OS X显然不...

这怎么能解决在Mac OS X上?是否有相当于一个“导入库”(创建.dll时由Windows链接器创建的存根库,因此,如果有任何模块需要动态链接到.dll,它与“导入库”链接)?或者其他解决方案?

回答

5

独立的Lua解释器支持动态加载(通过dlopen)使用可执行文件(Lua API)中的符号的共享库。构建时不使用特殊链接标志。共享库建成使用此咒语:

env MACOSX_DEPLOYMENT_TARGET=10.3 gcc -bundle -undefined dynamic_lookup -o random.so lrandom.o 
+1

顺便提一下,10.5和更高版本不需要“env MACOSX_DEPLOYMENT_TARGET = 10.3”。 – lhf 2011-01-18 21:31:57

4

谢谢你,你的回答刺激调查束和dylibs之间的差别的愿望。和LD的手册页提到的所谓-bundle_loader

选项-bundle_loader可执行
此规定将被加载束 输出文件被链接的可执行文件。将根据指定的可执行文件检查包 中的未定义符号,就像它是该包所链接的动态库的一个 一样。

(注意,构建一个dylib时-bundle_loader失败,则只能用捆绑的作品) 所以旧的命令行

cc -shared -o <output>.so <input>.c 

被辟为

cc -bundle -bundle_loader <executable> -o <output>.so <input>.c 

和输出束根据可执行文件解析了未定义的符号。

相关问题