2015-10-06 69 views
0

我難住了一個automake鏈接。即使在手冊上翻閱了幾個小時並在網上搜索,也可能是對自動工具的誤解。automake程序libtool包裝鏈接

我有一個由libtool製作的.la庫,一個.dylib共享庫,並且正在創建一個程序。 .la鏈接到.dylib,程序使用.la。

Makefile.am的.la庫

lib_LTLIBRARIES = libA.la 
libA_la_LDFLAGS = ${AM_LDFLAGS} -no-undefined 
libA_la_LIBADD = $(LIBM) -Ldir/to/ -lB 
libA_la_CPPFLAGS = ${AM_CPPFLAGS} 

Makefile.am的程序與libtool的包裝

noinst_PROGRAMS = test 
test_SOURCES = test_source.c 
test_LDADD = libA.la -Ldir/to/ -lB 

libA.la創建並鏈接到B.dylib但測試項目「包裝「由automake創建導出DYLD_LIBRARY_PATH找到libA.la而不鏈接到B.dylib。給錯誤

dyld: Library not loaded: ./B.dylib 
    Referenced from: /dir/to/test/.libs/test 
    Reason: image not found 
Trace/BPT trap: 5 

test_LDADD已經被補充說,我已經試過除了正在增加-Ldir/to/ -lBtest_LDFLAGS有些事情。並試圖設置test_LDFLAGS = -rpath -Ldir/to,希望將運行時搜索路徑設置爲B.dylib將幫助的目錄。

如果我手動導出DYLD_LIBRARY_PATH以包含/dir/to/B.dylib那麼測試程序可以運行,但我希望讓autotools處理此問題,而不是要求某人在能夠運行之前導出路徑。

回答

1

libB.dylib包括被複制到您的二進制和用來在運行時解決-lBrpath

而且似乎這是rpath是/path/to,所以libB.dylib不能運行時鏈接程序解決。 libA.la的原因是libtools知道libA.dylib中的rpath是錯誤無論如何(因爲您還沒有完成make install),因此需要手動設置。

解決此問題的唯一方法是使用install_name_tool修復所生成的二進制文件中存儲的rpath。 (即:我不認爲libtool會爲你做這個,因爲它違背了預期使用libB.dylib - 在其聲明rpath中)

1

的問題是libtool沒有參與建設libB.dylib,所以它不知道如何修復你的環境來找到它。這意味着它取決於你。您可以在您的環境中添加path/to/libB,或者將硬編碼的搜索路徑添加到libA.la,以便libA能夠找到它。

libA_la_LIBADD = $(LIBM) -Ldir/to/ -rpath dir/to/ -lB 

這不僅有libtool的libA.la文件,以便添加在力霸的二進制到B的路徑,而是將它添加到依賴項庫的平臺上,不會自動繼承rpath的規格也可以是鏈接時由Libtool添加。