OSX: 如何静态link一个库和动态link标准库?

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

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

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

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

您可以通过确保要 link 的静态库与动态库的名称不同来以最简单的方式执行此操作。否则,您可能会发现 linker 通过名称和 links 对 those 收集所有对共享库的引用很有帮助。这不是 OSX 特有的问题,而是许多具有共享库的系统的共同特征。

当静态库通常驻留在具有同名库的目录中时,确保您拥有静态库的一种方法是将符号 link 构建到临时目录中,然后使用 -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}

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

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

如果您在同一目录中有动态库 (random.dylib) 和静态库 (random.a),那么编译器会更喜欢 link 和 .dylib 而不是 .a