[英]A simple makefile with chain dependencies. “linker input file unused because linking not done” and g++ -c
我剛開始使用makefile,遇到了一個問題。 (C ++項目)
我正在嘗試建立一個依賴鏈:
main.cpp取決於類a。 而A類取決於B類。
主要思想是使用已經就緒的已編譯類b重新編譯類a,而類a沒有main()函數。 (當修改A類時)
生成文件
all: main.o
main.o: main.cpp classa.o
g++ main.cpp classa.o -o main.o
classa.o: classa.h classa.cpp classb.o
g++ -c classa.cpp classb.o -o classa.o
classb.o: classb.h classb.cpp
g++ -c classb.cpp -o classb.o
main.cpp
#include "classa.h"
int main() {
ClassA a;
return 0;
}
類
#ifndef CLASSA_H
#define CLASSA_H
#include "classb.h"
class ClassA {
private:
ClassB b;
public:
ClassA();
};
#endif // CLASSA_H
類cpp
#include "classa.h"
ClassA::ClassA() {
}
類
#ifndef CLASSB_H
#define CLASSB_H
class ClassB {
public:
ClassB();
};
#endif // CLASSB_H
classb.cpp
#include "classb.h"
ClassB::ClassB() {
}
當我使用make -f makefile時 ,出現以下錯誤:
g++ -c classb.cpp -o classb.o
g++ -c classa.cpp classb.o -o classa.o
g++: warning: classb.o: linker input file unused because linking not done
g++ main.cpp classa.o -o main.o
classa.o: In function `ClassA::ClassA()':
classa.cpp:(.text+0x18): undefined reference to `ClassB::ClassB()'
collect2: error: ld returned 1 exit status
makefile:4: recipe for target 'main.o' failed
make: *** [main.o] Error 1
我相信它開始於重用帶有-c參數的classb.o。
對我來說,-c是一個神奇的“, 當我編譯不帶main()函數的代碼時使用 ”參數。
如果您能啟發我哪里做錯了,而且我想做的事情是可能的,我將很高興。
問候,Chocolateftw
您的makefile應該看起來像這樣:
all: main
main: main.cpp classa.o classb.o
g++ main.cpp classa.o classb.o -o main
classa.o: classa.h classa.cpp
g++ -c classa.cpp -o classa.o
classb.o: classb.h classb.cpp
g++ -c classb.cpp -o classb.o
您可以從.cpp
文件構建.o
文件,然后將.o
文件鏈接到最終輸出(也從.cpp
文件構建)。
鏈接時需要列出所有相關的目標文件,而僅在編譯時不需要列出它們(這是當您使用-c
標志,告訴gcc
跳過鏈接步驟時會發生的情況)。
這里的關鍵是, classa.o
不依賴於classb.o
或classb.cpp
(它可能不依賴於classb.h
盡管在這種情況下,你可能想將它添加到的要求)。 完全鏈接的二進制文件都依賴於它們兩者,然后根據需要彼此依賴。
就是說,您可以通過不指定自己的規則而僅使用內置規則來極大地簡化上述makefile。 以下makefile應該可以執行您想要的操作。
all: main
main: classa.o classb.o
classa.o: classa.h
classb.o: classb.h
如果以后需要自定義的編譯器/鏈接器標志,則可以使用默認變量在適當的行上使用它們。 請參見10.3隱式規則使用的變量和10.2內置 規則 目錄,以獲取有關變量及其使用哪些規則的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.