簡體   English   中英

GCC鏈接靜態庫

[英]GCC linking a static library

我在SO上看到過類似的問題,但是每個人都有不同的答案和對我不起作用的目錄結構。

我的makefile:

CC = g++
DEBUG = -g -std=c++11
TARGET = main
OBJECT_FILES = BingResultSet.o main.o
INC_PATH = -I HTTPClientLib/include
LIB_PATH = -L HTTPClientLib/lib/

start: clean BingResultSet.o main.o
    $(CC) $(DEBUG) $(INC_PATH) $(LIB_PATH) $(OBJECT_FILES) -o $(TARGET)
    rm -f *.o

BingResultSet.o: BingResultSet.cpp BingResultSet.h
    $(CC) $(DEBUG) $(INC_PATH) $(LIB_PATH) -c BingResultSet.cpp

main.o: main.cpp
    $(CC) $(DEBUG) $(INC_PATH) $(LIB_PATH) -c main.cpp

clean:
    rm -f $(OBJECT_FILES) $(TARGET)

我的文件結構:

/Desktop/DataMiner/.cpp, .h, and makefile
/Desktop/DataMiner/HTTPClientLib/include/HTTPClient.h
/Desktop/DataMiner/HTTPClientLib/lib/HTTPClient.a

在我的makefile中鏈接我的靜態庫的正確方法是什么?

這是我的$ 0.02:

  1. 沒有涉及靜態庫。 假設您的意思是.o文件
  2. 您混合使用依賴項和構建規則,而要避免重復構建規則:

     $(TARGET): $(OBJECT_FILES) $(CXX) $(DEBUG) $(INC_PATH) $^ -o $@ $(LIB_PATH) %.o: %.cpp $(CXX) $(DEBUG) $(INC_PATH) -c $< -o $@ 
  3. 您將CC用於C ++編譯器。 那很奇怪。 使用CXX

  4. 編譯時使用了LDFLAGS
  5. 您對源路徑和目標路徑進行了硬編碼。 而是使用自動變量( $^$<表示源; $@表示目的地)

  6. 您試圖對標頭依賴項進行硬編碼。 這容易出錯,並且弄亂了源規范(您不希望$^在命令行中列出.h文件...)。 而是使用gcc -MM為您生成依賴項!

    接下來,對這些依賴項進行條件包含:

     .depends: $(CXX) -MM $(CXXFLAGS) -c *.cpp > $@ -include .depends 
  7. 保留.o文件通常很方便,因此您可以加快構建速度。 當然,在您自動生成標頭依賴項之前,這不是一個好計划。 如果您堅持,則可以注釋.PRECIOUS目標。 GNU Make自動刪除中間目標

這是我最終得到的集成產品:

CXX = g++
TARGET = main
OBJECT_FILES = BingResultSet.o main.o
INC_PATH = -I HTTPClientLib/include
LIB_PATH = -L HTTPClientLib/lib/

CPPFLAGS = -g -std=c++11
CPPFLAGS+= $(INC_PATH)

# standard derived flags:
CXXFLAGS+=$(CPPFLAGS)
LDFLAGS+=$(LIB_PATH)

start: .depends $(TARGET)

$(TARGET): $(OBJECT_FILES)
    $(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS)

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

clean:
    rm -f .depends $(OBJECT_FILES) $(TARGET)

# to keep the .o files:
.PRECIOUS: $(OBJECT_FILES)

.depends:
    $(CXX) -MM $(CXXFLAGS) -c *.cpp > $@

-include .depends

在一組非常簡單的文件示例中,您將獲得:

$ make clean
rm -f .depends BingResultSet.o main.o main
$ make 
g++ -MM -g -std=c++11 -I HTTPClientLib/include -c *.cpp > .depends
g++  -I HTTPClientLib/include -c BingResultSet.cpp -o BingResultSet.o
g++  -I HTTPClientLib/include -c main.cpp -o main.o
g++  -I HTTPClientLib/include BingResultSet.o main.o -o main -L HTTPClientLib/lib/
$ cat .depends 
BingResultSet.o: BingResultSet.cpp BingResultSet.h
main.o: main.cpp BingResultSet.h
test.o: test.cpp

¹(或類似內容,請參見手冊頁)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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