OSX:如何静态链接库和动态链接标准库

OSX: How to statically link a library and dynamically link the standard library?

本文关键字:链接 动态 标准 静态 何静态 OSX      更新时间:2023-10-16

如何指定clang静态链接某个库(在我的例子中是SDL2)并动态链接标准库?

使用-static是不好的,因为链接器也试图静态链接标准库,这在OSX中是被禁止的。另一方面,clang不知道-Wl,-Bstatic

将静态库放在目录./MyStaticLibs中,然后简单地使用-L./MyStaticLibs/ -l<StaticLibraryName>

编译器更喜欢动态版本而不是静态版本的库

如果您的动态库(random.dylib)和静态库(random.a)在同一目录中,则编译器将更喜欢并链接.dylib而不是.a

您只有两个选项:-L用于目录,-l用于库名称。

通过确保要链接的静态库的名称与动态库的名称不同,可以用最简单的方法实现这一点。否则,您可能会发现链接器按名称和链接收集了对共享库的所有引用,这些引用与这些有关。这不是一个特定于OSX的问题,而是许多具有共享库的系统所共有的特性。

当静态库通常驻留在具有相同名称库的目录中时,确保拥有静态库的一种方法是将符号链接构造到临时目录中,并将-L一起使用

类似这样的东西:

MYDIR=$(mktemp -d -t xxxxxx)
ln -sf /usr/local/libfoo.a ${MYDIR}/libfoo.a
clang -o foo -L${MYDIR} -l foo
rm -rf ${MYDIR}