2017-05-08 89 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'或其他東西。 –