2017-05-08 60 views
0

我试图在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

+0

'libquirc.dylib.1.0'与'helloquirc.c'存在于同一个目录吗?你有没有尝试在'-lquirc'标志之前放置'-L.'标志? – Evert

+0

@Engl对这两个问题 – Carpetfizz

回答

2

东西quirc的构建方式是错误的。正确的库名称类似于libquirc.1.0.dylib,其符号链接的名称为libquirc.dylib

它看起来像quirc有一个手写的makefile,而不是使用像gyp或cmake这样明智的东西。只要您不试图在多个平台上构建共享库,手写makefile就可以。然而,如果你只是自己编译它,如果你只是使用一个静态库,你可能会发现更简单的东西。如果您没有与任何人共享共享库(如果没有其他程序使用的的相同确切副本),则没有意义。

+0

我改变了'Makefile'来生成'libquirc.1.0.dylib',而不是通过更改更新的帖子中的行 仍然是同样的问题。我一定会考虑把它作为一个静态库,但我也想要解决这个问题 – Carpetfizz

+1

你做了符号链接?链接器正在寻找普通的'libquirc.dylib',它并不知道你是在寻找'libquirc.1.0.dylib'还是'libquirc.dylib.1.0'或'something_else_entirely.dylib'。 –

+0

@Carpetfizz:记住,你可以将库作为一个文件传递给链接器,而不是使用'-lmylib -Ldir',你可以传递'dir/libmylib.a'或其他东西。 –