2015-07-20 181 views
1

我看到過類似這樣的問題,但每個人都有不同的答案和目錄結構,不適合我。GCC鏈接一個靜態庫

我的生成文件:

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

makefile在構建之前不應該要求運行'clean'來獲得合理的結果。如果你需要你的makefile文件寫得不正確。每個目標應創建一個目標名稱(不是其他名稱)的文件,以便make可以正確地完成其工作。 –

+0

你問如何將'HTTPClient.a'鏈接到你的輸出'main'二進制文件?你知道如何與靜態庫鏈接正常工作嗎? (這是你如何在沒有makefile的情況下手工完成的?) –

+0

不確定你的意思是「手工沒有makefile」。我知道如何鏈接VS上的靜態庫,但現在我試圖在Linux上構建項目,所以gcc上的鏈接有點不同,給我一些問題。 –

回答

1

這裏是我的$ 0.02:

  1. 有沒有涉及靜態庫。假設你的意思是.o文件
  2. 你混的依賴性和構建規則,而不是,避免重蹈建立規則:

    $(TARGET): $(OBJECT_FILES) 
        $(CXX) $(DEBUG) $(INC_PATH) $^ -o [email protected] $(LIB_PATH) 
    
    %.o: %.cpp 
        $(CXX) $(DEBUG) $(INC_PATH) -c $< -o [email protected] 
    
  3. 您使用CC一個C++編譯器。真奇怪。使用CXX

  4. 您使用LDFLAGS當你剛剛編譯
  5. 你硬編碼的源和目標路徑。而是使用the automatic variables ($^, $< for source; [email protected] for destination)

  6. 您試圖硬編碼頭依賴關係。這很容易出錯,並且會弄亂源代碼規範(您不希望$^在您的命令行中列出.h文件...)。相反,請使用gcc -MM¹來爲您生成依賴關係!

    接下來,做一個條件包括那些依賴關係:

    .depends: 
        $(CXX) -MM $(CXXFLAGS) -c *.cpp > [email protected] 
    
    -include .depends 
    
  7. 它通常是得心應手保持.o文件,因此您可以加快構建。當然,直到你自動生成頭文件依賴關係,這不是一個好的計劃。如果你堅持,你可以評論.PRECIOUS目標。中期目標是通過GNU自動刪除請

這裏的集成產品我結束了:

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 [email protected] $(LDFLAGS) 

%.o: %.cpp 
    $(CXX) $(CXXFLAGS) -c $< -o [email protected] 

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

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

.depends: 
    $(CXX) -MM $(CXXFLAGS) -c *.cpp > [email protected] 

-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 

1(或相似,請參見手冊頁)

+0

謝謝你,先生! –

+1

@shawna你可以看到流的視頻[約29:00](https://www.livecoding.tv/video/modular-boost-refactor-makefile-and-more/)(原諒任何咒罵)([實驗] (http://chat.stackoverflow.com/transcript/10?m=24182469#24182469)) – sehe

+0

好吧,謝謝哈哈 –