2011-11-08 42 views
1

在書Autotools: A Practioner's Guide to GNU Autoconf, Automake, and Libtool的第6章(使用libtool構建庫)中,給出了鏈接庫的example如何鏈接到libabc.a而不是libabc.so?

在該示例中,庫libjupiter.so鏈接到另一庫libjupcommon.a。第一次嘗試失敗,因爲libjupiter.so需要PIC,但是libjupcommon.a不是。作者補充libjupcommon_a_CFLAGS = -fPIC來修復它。它變得好多了,但'的警告將共享庫libjupiter.la與靜態庫../common/libjupcommon.a鏈接起來並不方便!'出現。

因此,作者再次修改Makefile.am,使用libtool構建libjupcommon.lalibjupiter鏈接到libjupcommon.la。 像這樣:

noinst_LTLIBRARIES = libjupcommon.la

libjupcommon_la_SOURCES = jupcommon.h print.c

...

libjupiter_la_LIBADD =。 ./common/libjupcommon.la

這一次一切正常。


現在,我的問題:

我有一個圖書館需要另一個庫,就像libjupiter需求libjupcommon。不同的是我的libjupcommon來自另一個項目並安裝到系統中。這不是noinst_LTLIBRARIES。存在版本.so.a版本。當我嘗試鏈接libjupcommon.la(如示例所示)時,選擇了.so,但我不想要動態鏈接關係。我想鏈接到.a,就像書中的例子。

顯式鏈接到.a(通過使用_LIBADD = .a文件)給出了一個可用的庫,但給出了'...不可移植'的警告。

在這種情況下,鏈接到.a的正確方法是什麼?請參考book's official site。在autotools/book/jupiter-libtool-ch6/common中,將Makefile.am的noinst_LTLIBRARIES修改爲lib_LTLIBRARIES應該與我的問題很接近。

+0

你想建立什麼樣的圖書館?共享庫或靜態庫?如果您正在構建共享庫,那麼與已安裝的'.a'庫鏈接是沒有意義的,因此libtoool警告。如果你正在構建一個靜態庫,你應該明確聲明(參見ldav1s的答案)。 – adl

+0

我想建立一個共享庫。即使安裝的'.a'是PIC也沒有意義?爲什麼這樣? –

+0

但是在這種情況下,'.a'不是由Libtool生成的。據我所知,Libtool安裝的'.a'文件不是PIC。 – adl

回答

2

有幾件事你可以嘗試。您可以嘗試運行configure--disable-shared選項以關閉共享庫的編譯(並再次將靜態庫添加到libfoo_LIBADD)。您可以嘗試添加-staticlibfoo_LDFLAGS以使libtool靜態構建(再次將靜態lib添加到libfoo_LIBADD)。

編輯:由於需要靜態和共享庫,上述將無法正常工作。

嘗試增加:

AC_CHECK_LIB([abc],[some_function_in_libabc]) 

到configure.ac。

+0

你的意思是隻編譯靜態的?我認爲它會起作用。但我需要靜態和動態'libjupcommon';並使'libjupiter.so'鏈接靜態的。 –

+0

noinst_LTLIBRARIES是便利庫,旨在在構建過程中與某些可執行文件或其他庫重新鏈接。 – ldav1s

+0

閱讀libtool的代碼後,我確信建立一個靜態唯一的庫是我應該做的。像libfoo.so,libfoo.a libfoo_static.a。謝謝ldav1s。 –

1

您可以強制靜態鏈接到一個庫(同時保持共享的所有其他鏈接)使用此結構:

 
-Wl,-Bstatic -Wl,-whole-archive -Xlinker -l$1 -Wl,-no-whole-archive -Wl,-Bdynamic 

更換超過$ 1你的庫名。

說明:上述大部分怪物都是爲了解決libtool會重新安排命令行參數這一事實,因此非常有幫助。使用-Xlinker將強制libtool忽略-l $ 1,而不是重新排列它。 -Wl,-Bstatic指示鏈接器將所有以下庫鏈接爲靜態。 -Wl,-B動態切換回到動態鏈接進一步庫。

相關問題