我有一个适用于Linux的Makefile,现在要进行移植到Darwin平台。这个Makefile需要将一堆.o文件链接在一起形成一个.so共享对象。我认为(可能错了),在Darwin中最好的替代品是dylib。所以我将-shared标志改为-dynamiclib。
现在,我要将代码链接到dylib中,这些代码依赖于很多外部库。尝试构建dylib时,会出现未定义引用的错误。但是Linux Makefile在创建.so文件的构建步骤中没有指定任何-lwhatever或-L/path/whatever选项。这是为什么呢?这是因为当你创建一个ELF .so文件时,默认情况下会保留外部引用不变,并且当加载共享库时,它会递归地加载被加载的共享库所依赖的共享库。如果共享库依赖于.a或.o文件,那么你必须将它们静态链接到共享库中,否则无法在运行时链接。如何才能在运行时加载具有未定义引用的库,除非引用也指向可动态加载的库?
总之,如果我指定
现在,我要将代码链接到dylib中,这些代码依赖于很多外部库。尝试构建dylib时,会出现未定义引用的错误。但是Linux Makefile在创建.so文件的构建步骤中没有指定任何-lwhatever或-L/path/whatever选项。这是为什么呢?这是因为当你创建一个ELF .so文件时,默认情况下会保留外部引用不变,并且当加载共享库时,它会递归地加载被加载的共享库所依赖的共享库。如果共享库依赖于.a或.o文件,那么你必须将它们静态链接到共享库中,否则无法在运行时链接。如何才能在运行时加载具有未定义引用的库,除非引用也指向可动态加载的库?
总之,如果我指定
-undefined suppress -flat_namespace
在创建共享库时,它不要求我添加那些-l和-L选项。但我仍然不明白最终这是如何工作的。