我正在编写一个可执行文件,它使用 dlopen()(Windows 上的 LoadLibrary())来动态加载共享库。共享库使用可执行文件中的符号。
在 Windows 中这是可能的。可执行文件可以导出符号:declspec(dllexport) 和 .def 文件都可以。链接器在创建 .exe 时也会创建 .lib 文件(“导入库”),因此 DLL 只需与该 .lib 链接即可。
在 Linux 中,这也是可能的。我在构建可执行文件时通过 -Wl,-export_dynamic 以便导出其符号。
相反,在 Mac OS X 上... -Wl,-export_dynamic 不起作用,但有 -Wl,-exported_symbols_list,<filename>
其中<filename>
是要导出的符号列表(一种更简单的 .def 文件版本)。但是,构建共享库并不容易:链接器抱怨未解析的符号。
我尝试了一个技巧:将可执行文件重命名为 lib <executable>
.dylib ,并且在链接共享库时,我通过了 -l <executable>
。但它给出了错误“无法与主可执行文件链接”。
一般的问题是 Linux 共享库可以有未解析的符号,而 Windows 和 Mac OS X 不允许。但是 Windows 有“导入库”来解决依赖关系的符号,而 Mac OS X 显然没有......
如何在 Mac OS X 上解决这个问题?是否有等效的“导入库”(Windows 链接器在创建 .dll 时创建的存根库,因此,如果任何模块需要动态链接到 .dll,则它与“导入库”链接)?还是其他解决方案?