簡體   English   中英

具有鏈依賴關系的簡單makefile。 “鏈接器輸入文件未使用,因為未完成鏈接”和g ++ -c

[英]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類時)

這是我的makefile:

生成文件

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.oclassb.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.

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