這是一個基本的,不切實際的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.so
或libfoo.a
,它將立即停止搜索 。 如果它發現這兩個他們在同一目錄中,則默認情況下它會鏈接libfoo.so
與 您的程序,而不是鏈接libfoo.a
。
您需要添加-L選項以設置要找到您的庫的目錄。鏈接器不會在當前目錄中查找使用-l指定的庫。如果你所有的構建發生在一個目錄中,'-L.'應該可以正常工作。 –