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
我如何指定 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