2013-10-09 108 views
0

我在Mac OS X中一個makefile,併爲最終的編譯最後一個命令行是:靜態庫

gcc count_words.o lexer.o -lfl -o count_words 

但它響應:

ld: library not found for -lfl 
collect2: ld returned 1 exit status 

我發現,庫libfl.a是在/ opt/local/lib目錄/和修改命令行改爲:

gcc count_words.o lexer.o -L/opt/local/lib/ -lfl -o count_words 

它完美的作品,但我讀過的時候可以看到形式-l的先決條件,GNU使得搜索形式爲libNAME.so的文件;如果找不到匹配項,則搜索libNAME.a。這裏make應該找到/opt/local/lib/libfl.a並且繼續最後一個動作,鏈接,但是這不會發生。

我嘗試使用LD_LIBRARY_PATH,然後意識到,因爲我在Mac上工作,我必須使用DYLD_LIBRARY_PATH,我導出指向/ opt/local/lib的變量,並嘗試再次運行makefile,無法正常工作。發現另一個名爲DYLD_FALLBACK_LIBRARY_PATH的環境變量,導出,沒有工作。

我該怎麼辦?

回答

0

make根本不搜索該庫。 make只是調用其他工具。 (ld,由gcc調用)所有您需要做的是從make將適當的標誌傳遞給gcc。也許,這只是意味着增加

LDFLAGS=-L/opt/local/lib 

到你的Makefile(或者直接編輯命令,因爲它似乎你已經在測試過程中完成),但很難說沒有看到Makefile文件。

4

DYLD_LIBRARY_PATH(和LD_LIBRARY_PATH其他Unix系統)提供了搜索路徑的裝載機,在運行時解決鏈接庫。 LIBRARY_PATH是提供編譯器將在鏈接時傳遞給鏈接器的路徑的相關變量。

但是,OS X的鏈接器ld64沒有辦法在兩種庫存在的情況下選擇靜態鏈接而不是動態鏈接,這意味着您的唯一選擇是將完整路徑傳遞到存檔。

gcc count_words.o lexer.o /opt/local/lib/libfl.a -o count_words 

這是真的那麼-l做它搜索路徑和擴展的lib名之後。