2012-07-05 65 views
22

靜態庫,我有以下生成文件如何包括在生成文件

CXXFILES = pthreads.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine 
LIBS = -lpthread -ldl 

all: 
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS) 

clean: 
    rm -f prog *.o 

我想包括內CXXFLAGS./libmine庫,但現在看來似乎是不包括靜態庫的正確方法,因爲當我編譯程序時,出現很多未定義的引用錯誤。那麼實際上在makefile中包含靜態庫的正確方法是什麼?

回答

13
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine 
LIBS = libmine.a -lpthread 
最終鏈接線
+2

你能解釋一下這是如何工作的嗎? – Tony 2016-10-26 07:29:13

+4

OP在'gcc'編譯和鏈接行中添加了'-L。/ libmine',但沒有添加'libmine.a'。 '-L。/ libmine'告訴'gcc'查看'./ libmine'目錄來搜索對象文件和庫。添加'libmine.a'告訴'gcc'你想要將你的可執行文件和'libmine.a'庫鏈接起來。 – ouah 2016-10-26 13:07:51

+0

LIBS = libmine.a不適用於-L./libmine。 – fchen 2017-10-08 05:13:05

8

-L僅僅給出了在何處可以找到.a.so文件的路徑。你正在尋找的是將-lmine添加到LIBS變量。

使-static -lmine強制它選擇靜態庫(如果存在靜態庫和動態庫)。

+0

我讀了關於'-static'標誌,但我擔心'-static'會讓所有引用的庫都是靜態的,當我只想要一個。將'-static'標記爲靜態的進程引用嗎? – Blake 2014-09-09 13:50:34

+1

@ Cokemonkey11:'-static'之後的任何庫應該更喜歡庫的靜態版本,是的。 – 0xC0000022L 2014-09-09 23:11:35

+0

@ 0xC00000022L所以如果我做'-static -lfoo -bar',foo和bar都是靜態的嗎?我只希望foo是靜態的 - 這正是我想要問的。編輯:我只希望富*明確*靜態,而我想欄有標準的鏈接行爲。 – Blake 2014-09-10 08:41:17

34

使用

LDFLAGS= -L<Directory where the library resides> -l<library name> 

像:

LDFLAGS = -L. -lmine 

確保靜態編譯,你還可以添加

LDFLAGS = -static 

或者你可以擺脫全庫搜索,並鏈接與它直接。

說你有 的main.c fun.c

和libmine.a

靜態庫,然後你可以做的Makefile中

$(CC) $(CFLAGS) main.o fun.o libmine.a 
11

確保-L選項出現在-l選項之前;鏈接器命令行中的選項順序是,特別是與靜態庫。 -L選項指定要爲庫(靜態或共享)搜索的目錄。 -lname選項指定一個與libmine.a(靜態)或libmine.so(在Unix的大多數變體上共享,但Mac OS X使用.dylib並且HP-UX用於使用.sl)的庫。通常,靜態庫將在文件libmine.a中。這是約定,不是強制性的,但如果名稱不是libmine.a格式,則不能使用-lmine表示法找到它;您必須在編譯器(鏈接器)命令行上明確列出它。

-L./libmine選項中顯示「有一個子目錄libmine可以通過搜索查找庫」。我可以看到三種可能:

  1. 你有一個包含libmine.a這樣的子目錄,在這種情況下,你還需要添加-lmine到連接線(引用該庫的目標文件後)。
  2. 您有一個文件libmine這是一個靜態存檔,在這種情況下,您只需將其列爲前面沒有-L的文件./libmine即可。
  3. 在當前目錄中有一個文件libmine.a,您可以選取該文件。你可以寫./libmine.a-L . -lmine,兩者都應該找到庫。