[英]Linking static library with -l flag
如何使用-l標志編譯makefile?
我有一個看起來像的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
我收到一個錯誤。 兩個都不應該一樣嗎?
這是一個基本的,不切實際的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
的makefile和其他makefile。
這是gcc鏈接選項-L
和-l
工作方式:
-L/path/to/search
告訴鏈接器在/path/to/search
您使用-l
選項指定的任何庫,然后在其默認搜索目錄中查找它們。 當前目錄, .
,不是鏈接器的默認搜索目錄之一。 因此,如果您希望它在當前目錄中找到使用-l
選項指定的庫,則需要指定-L.
-lfoo
告訴鏈接器按照您指定的順序,首先在-L
目錄中搜索動態庫libfoo.so
或靜態庫libfoo.a
,然后在其默認搜索目錄中搜索。 如果在其中一個搜索目錄中找到libfoo.so
或libfoo.a
,它會立即停止搜索。 如果它發現他們都在同一個目錄,然后默認情況下它會鏈接libfoo.so
與您的程序,而不是鏈接libfoo.a
。
要純粹鏈接靜態庫,請使用-static,Like
gcc -static main.c libmyLibrary.a
並運行可執行文件./a.out
GCC Linux。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.