无法链接macOS中的动态库
我试图在C项目中使用名为quirc的C库。到目前为止,我通过修改使用Linux .so
文件的Makefile
生成了libquirc.dylib.1.0
。无法链接macOS中的动态库
#include <quirc.h>
#include <stdio.h>
int main() {
struct quirc *qr;
qr = quirc_new();
if (!qr) {
printf("Failed to allocate memory");
}
quirc_destroy(qr);
return 0;
}
我已经创建的上述源文件在库的根
quirc/helloquirc.c。我使用下面的命令来编译:
gcc helloquirc.c -lquirc -L. -Ilib -o helloquirc
据我了解的-l
标志指定的动态库的名称,-L
标志指定的动态库的位置,-I
标志指定的位置头文件和-o
指定可执行文件的名称。
当我运行这个命令,我得到以下错误:
ld: library not found for -lquirc
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我用这条线
.PHONY: libquirc.dylib
libquirc.dylib: libquirc.$(LIB_VERSION).dylib
libquirc.$(LIB_VERSION).dylib: $(LIB_OBJ)
$(CC) -shared -dynamiclib -o [email protected] $(LIB_OBJ) $(LDFLAGS) -lm
和改变.so.$(LIB_VERSION)
其他情况下改变了Makefile
到.$(LIB_VERSION).dylib
东西quirc
的构建方式是错误的。正确的库名称类似于libquirc.1.0.dylib
,其符号链接的名称为libquirc.dylib
。
它看起来像quirc有一个手写的makefile,而不是使用像gyp或cmake这样明智的东西。只要您不试图在多个平台上构建共享库,手写makefile就可以。然而,如果你只是自己编译它,如果你只是使用一个静态库,你可能会发现更简单的东西。如果您没有与任何人共享共享库(如果没有其他程序使用的的相同确切副本),则没有意义。
我改变了'Makefile'来生成'libquirc.1.0.dylib',而不是通过更改更新的帖子中的行 仍然是同样的问题。我一定会考虑把它作为一个静态库,但我也想要解决这个问题 – Carpetfizz
你做了符号链接?链接器正在寻找普通的'libquirc.dylib',它并不知道你是在寻找'libquirc.1.0.dylib'还是'libquirc.dylib.1.0'或'something_else_entirely.dylib'。 –
@Carpetfizz:记住,你可以将库作为一个文件传递给链接器,而不是使用'-lmylib -Ldir',你可以传递'dir/libmylib.a'或其他东西。 –
'libquirc.dylib.1.0'与'helloquirc.c'存在于同一个目录吗?你有没有尝试在'-lquirc'标志之前放置'-L.'标志? – Evert
@Engl对这两个问题 – Carpetfizz