我有一个用于 linux 的 Makefile,我将其移植到 Darwin。makefile 需要一堆 .o 文件并将它们链接在一起成为一个 .so 共享对象。好的,所以我想(我错了吗?)达尔文最好的模拟是 dylib。所以我将 -shared 标志更改为 -dynamiclib。
现在,我链接到 dylib 中的代码依赖于许多外部库。当我尝试构建 dylib 时,我收到错误消息,提示存在未定义的引用。但是 Linux Makefile 没有在创建 .so 文件的构建步骤中指定任何 -lwhatever 或 -L/path/whatever 选项。嗯?这是因为当您创建 ELF .so 文件时,默认情况下它会保留未解析的外部引用,然后在加载共享库时,它会递归加载您正在加载的共享库所依赖的共享库?如果共享库依赖于 .a 或 .o 文件,您是否必须将它们静态链接到共享库中,否则您无法在运行时链接?你怎么能摆脱在运行时加载的库中有未定义的引用,除非引用也是动态加载的库?
无论如何,如果我指定
-undefined suppress -flat_namespace
它不需要我在创建共享库时添加那些 -l 和 -L 选项。但我仍然不明白这最终如何运作。