在書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.la
。 libjupiter
鏈接到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
應該與我的問題很接近。
你想建立什麼樣的圖書館?共享庫或靜態庫?如果您正在構建共享庫,那麼與已安裝的'.a'庫鏈接是沒有意義的,因此libtoool警告。如果你正在構建一個靜態庫,你應該明確聲明(參見ldav1s的答案)。 – adl
我想建立一個共享庫。即使安裝的'.a'是PIC也沒有意義?爲什麼這樣? –
但是在這種情況下,'.a'不是由Libtool生成的。據我所知,Libtool安裝的'.a'文件不是PIC。 – adl