2017-02-15 175 views
0

如何使用-l標誌編譯我的makefile?使用-l標誌鏈接靜態庫

我有一個makefile,看起來像

myLibrary: 
    gcc -c myLibrary.c -o myLibrary.o 
    ar cr libmyLibrary.a myLibrary.o 

,然後我編譯我的主要程序與

main: 
    gcc -g -c -o main.o main.c 
    gcc main.o -o main libmyLibrary.a 

以上的Makefile作品,但如果我想更換

libmyLibrary.a 

-lmyLibrary我收到一個錯誤。不應該一樣工作嗎?

+2

您需要添加-L選項以設置要找到您的庫的目錄。鏈接器不會在當前目錄中查找使用-l指定的庫。如果你所有的構建發生在一個目錄中,'-L.'應該可以正常工作。 –

回答

1

這是一個基本的,不切實際的makefile文件,這將使靜態庫libmyLibary 它使程序main,它將與靜態庫 使用-L(庫搜索路徑)和-l(庫)選項鍊接之前。

的Makefile

.PHONY: all clean 

all: libmyLibrary.a main 

main: main.o | libmyLibrary.a 
    $(CC) -o main main.o -L. -lmyLibrary 

libmyLibrary.a: myLibrary.o 
    $(AR) rcs libmyLibrary.a myLibrary.o 

clean: 
    rm -f *.o libmyLibrary.a main 

它運行,如:

$ make 
cc -c -o myLibrary.o myLibrary.c 
ar rcs libmyLibrary.a myLibrary.o 
cc -c -o main.o main.c 
cc -o main main.o -L. -lmyLibrary 

當我想你知道,這是不現實的,使這兩個圖書館和在相同的makefile與它連接的程序 ,因爲一個庫的點是 ,你不需要繼續重建它以鏈接它與許多程序。你真的有 生成文件libmyLibrary.a和 使用它的程序的其他生成文件。

這是怎麼gcc的鏈接選項-L-l工作:

-L/path/to/search 

告知鏈接查找您用-l選項/path/to/search指定, 任何庫,它看起來對他們在其默認前搜索目錄。當前目錄., 不是鏈接器的默認搜索目錄之一。所以,如果你想讓它 找到當前目錄下的-l選項指定庫,那麼你需要 指定-L.

-lfoo 

告知鏈接搜索任何一個動態庫,libfoo.so,或靜態 庫,libfoo.a,首先在您的-L目錄中,如果有的話,按照 指定的順序,然後在其默認搜索目錄中。如果在其中一個搜索目錄中找到libfoo.solibfoo.a,它將立即停止搜索 。 如果它發現這兩個他們在同一目錄中,則默認情況下它會鏈接libfoo.so與 您的程序,而不是鏈接libfoo.a

+0

謝謝!我正在嘗試使用-L,但直到我在它之後添加了一段時間之後才起作用 – FreeStyle4

1

要連結純粹的靜態庫,使用-static,像

gcc -static main.c libmyLibrary.a 

並運行可執行文件./a.out GCC的Linux。

+0

我試圖避免使用libmyLibrary.a來調用它,我必須使用-l標誌來調用它 – FreeStyle4