[英]g++ - not reflecting changes made in source file
我正在構建一個結構如下的項目:
- Makefile
- main.cpp
- util.h
- subsrc/
- one.cpp
- two.cpp
我將 Makefile 設置為 output 到構建目錄:
all: $(BIN_FILE)
$(BIN_FILE): $(OBJ_FILES)
mkdir -p $(BIN_DIR)
g++ $^ -o $@
$(OBJ_DIR)/%.o: %.cpp
mkdir -p $(OBJ_DIR)
g++ -c $^ -o $@
$(OBJ_DIR)/subsrc/%.o: subsrc/%.cpp
mkdir -p $(OBJ_DIR)/subsrc
g++ -c $^ -o $@
clean:
rm -rf $(BUILD_DIR)/*
但是,當我手動運行 g++ 時,我也看到了這個問題,所以我認為它與 Makefile 無關。
我可以從干凈開始構建,一切正常。 問題是當我更改其中一個 subsrc 文件並嘗試通過make
或自己運行這些命令重新編譯時:
g++ -c subsrc/one.cpp -o build/obj/subsrc/one.o
g++ build/obj/main.o build/obj/subsrc/one.o build/obj/subsrc/two.o -o build/bin/prog
如果我這樣做,在one.cpp
中所做的更改不會反映在二進制 output 中。 如果我重新編譯main.cpp
(或者,當然,整個項目),它工作正常。 這不是 g++ 沒有正確覆蓋文件的問題,因為即使我在運行上述命令之前rm build/obj/subsrc/one.o
和/或rm build/bin/prog
,我仍然看不到更改。 這對我來說毫無意義,我不知道發生了什么。
編輯:我在這里上傳了一個最小可重現的例子。 https://github.com/scatter-dev/so_70242118_min_repro
復制說明:
make
或運行上面的 g++ 命令構建。doWork
function 的one.cpp
。 保存到磁盤。make
並注意one.o
文件被重新編譯,並使用 linker 重新創建prog
。 在評論者的建議下,我在步驟 1 和步驟 4 之間檢查了one.o
和prog
的 md5sum,它們確實是相同的。 即使我在重新編譯之前刪除one.o
,情況仍然如此。 是的,我確信one.cpp
已保存到磁盤(它的 md5sum 確實發生了變化,而且make clean && make
將使用新的更改進行編譯)。
您的問題是您的代碼編寫得很奇怪,因此您的 makefile 不完整。
在您的 main.cpp 中,您有:
#include "subsrc/derived.h"
這很好,但在 header 你有:
#include "one.cpp"
#include "two.cpp"
這是非常奇怪的。 您幾乎不想在其他源文件(或 header 文件)中包含.cpp
文件。 這只是個壞主意。
在這種情況下,您程序的所有內容都包含在main.cpp
中,因此會出現在您的main.o
文件中。 鏈接其他對象( one.o
和two.o
)是無用且不必要的:它們被忽略。
但是,在您的 makefile 中,您沒有列出one.cpp
或two.cpp
作為main.o
的先決條件,這意味着當您修改這些源文件時main.o
不會更新,因此沒有任何變化。 如果刪除main.o
,則會重新編譯它並獲得新的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.