2011-08-18 56 views
14

如何構建和安裝.so模塊與autotools/libtool沒有.la和.a庫 也安裝到--prefix路徑?建立.so模塊與autotools/libtool沒有.la和.a變體正在安裝

目前我使用以下Makefile.am:

lib_LTLIBRARIES = libCurlDownloader.la 
libCurlDownloader_la_SOURCES = Curl.cpp 
libCurlDownloader_la_LDFLAGS = -module -avoid-version 

它的工作原理,但除了libCurlDownloader.so也安裝libCurlDownloader.la和libCurlDownloader.a,什麼是不可取的。

更新#1

它可以使通過使用.A不會產生,無論是

./configure --disable-static 

AC_ENABLE_SHARED(yes) 
AC_ENABLE_STATIC(no) 

在configure.ac

但它仍然是如何使.la不是b的問題eing在安裝.so時安裝到安裝--prefix中。

更新#2

它可以刪除安裝文件.la使用--prefix

install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete 
+0

你有一個小錯字(應該是install-exec-hook)。 – Compholio

+0

我認爲你不能,debian打包工具在deb包中手動刪除la文件 – sherpya

+0

'install-exec-hook'似乎是個不錯的主意。它會從目錄中刪除所有.la文件,而不僅僅是項目生成的.la文件。如果使用了'DESTDIR',那麼問題就不大了,否則就是非常錯誤的。 – Maarten

回答

1

你應該不必刪除.la文件。該.la文件包含了在兩種情況下使用的信息:

  1. 靜態鏈接內置庫。當靜態鏈接(即.a-static)時,沒有關於正在鏈接的庫的依賴關係的信息,因此libtool可以使用.la文件中的信息來創建引用所有必需依賴關係的適當ld命令。這對於像MinGW這樣的環境通常更重要,其中鏈接器需要以特定順序指定倍數的相同庫來解決遞歸依賴關係。如果打算構建一個靜態二進制文件,這只是一個問題。

  2. 動態加載庫構建上一些平臺(即,與lt_dlopen如果使用libltdl)。同樣,在某些平臺上,編譯模塊的依賴關係不在二進制文件中進行編碼,因此需要.la文件,以便lt_dlopen可以找到並加載正確的依賴關係。在ELF平臺(包括Linux)和PE平臺(即Windows)上,依賴關係存儲在庫中,所以lt_dlopen將在沒有.la文件的情況下運行。構建捆綁包時,MacOS上的MachO格式可能需要.la文件。

在Debian/Ubuntu的包裝企業已經決定將其從包裝排除.la文件,因爲第二個原因是沒有在Linux上適當的,他們寧願你沒有在第一時間建立靜態的二進制文件。在libtool旨在支持的其他平臺上,鏈接或運行程序可能需要.la文件。

+2

對於靜態鏈接依賴關係;幾乎總是(甚至更常見的是現有的.la文件)「pkg-config」說明可用。 –

+3

similary - 即使對於動態鏈接'pkg-config'提供了一個更好的幫助,然後libtool柺杖;採用獨立於構建系統的方式。 –

2

我偶然發現了這個問題,因爲它使用了術語「模塊」,它在automake/libtool中說的是插件的術語。我在Finit中有一個插件系統,所以我用'-module'構建我的插件以避免創建.a文件。但我仍然安裝了.la文件,這實際上甚至不適用於'-module'的情況。

我還沒有找到一個文件的方式來跳過.la的插件文件,但這裏是我如何做到這一點:

AM_LDFLAGS = -module -avoid-version -shared 
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la 

install-exec-hook: 
     @(cd $(DESTDIR)$(pkglibdir) && $(RM) $(pkglib_LTLIBRARIES)) 

需要明確的是,在我的用例沒有人去「鏈接」對我的插件.so的,所以.la文件真的沒用。

+0

你有沒有找到它?我真的很討厭這個。 –

+0

@iharob nope,仍然使用該鉤子規則來清理.la文件。如果你想看更多的細節,該項目是[這裏](https://github.com/troglobit/finit)。 – troglobit