2009-09-03 67 views
2

我正在創建一個實用程序,取決於libassuan撇開其他依賴。雖然這些'其他'提供共享庫,但libassuan只有靜態的。便攜式方式靜態鏈接到其中一個庫

libassuan都配備了簡單libassuan-config工具,它旨在爲編譯器/連接器使用提供CFLAGS & LDFLAGS。這些LDFLAGS將該庫稱爲-lassuan

化妝的標準調用的結果則是:

cc -I/usr/include/libmirage -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include  -lmirage -lglib-2.0 -L/usr/lib64 -lassuan -o mirage2iso mirage2iso.c mirage-getopt.o mirage-wrapper.o mirage-password.o 
mirage-password.o: In function `mirage_input_password': 
mirage-password.c:(.text+0x1f): undefined reference to `assuan_pipe_connect' 
mirage-password.c:(.text+0x32): undefined reference to `assuan_strerror' 
collect2: ld returned 1 exit status 
make: *** [mirage2iso] Error 1

(我剛開始寫這個單元,這就是爲什麼有沒有更多的錯誤)

所以,如果我理解結果正確,gcc不想將該應用鏈接到libassuan.a

使用-static這裏會導致gcc優先選擇靜態庫而不是縮進的shared。我見過的解決方案建議使用類似的東西:

-Wl,-Bstatic -lassuan -Wl,-Bdynamic 

但我不認爲這將是一個便攜式。

我認爲最好的解決方案是提供靜態庫文件的完整路徑,但libassuan-config沒有提供太多的幫助(我可以從中得到的是-L/usr/lib64 -lassuan)。

也許我應該嘗試通過「解析」來創建靜態庫的路徑返回LDFLAGS和使用-L目錄名和-l的庫名 - 然後希望在所有情況下libassuan-config將返回它這樣。

您對此有何看法?有沒有好的,簡單的便攜式解決方案來解決這個問題?

PS。請注意,雖然我在這裏指的是gcc,但我想使用能夠與其他編譯器一起工作的東西。

PS2。還有一個問題:如果包只安裝靜態庫,返回LDFLAGS而不是完整的.la路徑可以被認爲是一個錯誤?

回答

1

GCC將鏈接到libassuan.a如果它沒有找到libassuan.so

這也可能是符號在靜態庫擡頭的順序,當你鏈接。訂單很重要。 ) 假設GCC可以找到libassuan.a,它實際上提供了接頭抱怨的功能,嘗試:

CC -I/USR /包含/ libmirage -I的/ usr /包括/油嘴-2.0 -I/USR /lib64/glib-2.0/include -lmirage -lglib-2.0 -L/usr/lib64 -o mirage2iso mirage2iso.c mirage-getopt。o mirage-wrapper.o mirage-password.o -lassuan

既然你說libassuan位於/ usr/lib64下,它可能是一個64位的庫,你的應用程序和其他庫是否也是64位?

+0

非常感謝你,將'LDFLAGS'移動到命令行結束後,一切正常。雖然'libassuan-config'沒有像pkg-config一樣提供拆分'LDFLAGS'&'LIBS'。 – 2009-09-03 18:23:18

0

哪個目錄是libassuan.a在

我覺得第一個錯誤是不是GCC不想要連接的應用libassuan.a更GCC不知道從哪裏libassuan.a。你需要傳遞gcc一個-L參數給libassuan.a的路徑。 例如 -L /家庭/路徑

1

編譯器的命令行選項不是一個便攜式的東西。沒有標準。每個編譯器都使用它自己的,而且有幾個編譯器只是非正式地同意以命令行格式相互遵守。當然,最便捷的連接方式是使用libassuan-config。我認爲,它不僅可以生成gcc標誌,還可以生成其他編譯器。如果它不能,那麼就不存在可移植的方式,我想(除了CMake或更高級別的東西)。

您顯示的命令行爲cc是完全正確的。如果你有一個靜態庫libassuan.la,並且它的路徑被提供給-L選項,那麼編譯器就會鏈接它。你可以從它的輸出中看到它:它沒有找到靜態庫,它會抱怨錯誤信息,如「無法找到-lassuan」。 I

此外,如果沒有找到libassuan.so,則編譯器將靜態鏈接到您的庫,即使您沒有使用-Wl,-Bstatic stuff或-static標誌。

您的問題可能在於系統中libassuan的多個版本的持久性。除此之外,我沒有看到你提供的任何錯誤。