OSX: 如何静态链接一个库并动态链接标准库?

8
我该如何指定clang静态链接某个库(在我这里是SDL2),并动态链接标准库?
使用-static不好,因为链接器也会尝试静态链接标准库,而这在OSX中是禁止的。另一方面,clang不知道-Wl,-Bstatic

你是否正在尝试将一个 .dylib 静态链接到你的程序中? - zneak
该库也有.a版本可用(在我的情况下是SDL2)。 - Arcanelab
当您使用-l参数将库传递给Clang时,如果存在.dylib文件,链接器将始终选择它而不是.a文件。这是Apple已知的一个错误。您可以通过向库路径添加一个带有库副本(或链接)的虚拟目录来解决此问题。 - zneak
2个回答

10
将您的静态库放在目录./MyStaticLibs中,然后简单地使用-L./MyStaticLibs/ -l<StaticLibraryName>
编译器更喜欢动态库而非静态库
如果您的动态库(random.dylib)和静态库(random.a)在同一个目录中,则编译器会优先链接.dylib而不是.a

5
您只有几个选项:用于目录的-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}

这绝对是可怕的,但这是我找到的唯一方法 - 特别是因为我想使用-hidden-l,这会防止我在没有-l的情况下指定路径 - 你知道你提出的方法是否仍然是2022年唯一的方法吗? - mmomtchev
可能是。请参见此链接 - Thomas Dickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接