簡體   English   中英

使用-l標志鏈接靜態庫

[英]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.solibfoo.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM