簡體   English   中英

g++ - 不反映源文件中所做的更改

[英]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

復制說明:

  1. 使用make或運行上面的 g++ 命令構建。
  2. 運行程序以確保它已正確構建。
  3. 在 one.cpp 中更改doWork function 的one.cpp 保存到磁盤。
  4. 重新運行make並注意one.o文件被重新編譯,並使用 linker 重新創建prog
  5. 再次運行程序,看到output沒有變化。

在評論者的建議下,我在步驟 1 和步驟 4 之間檢查了one.oprog的 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.otwo.o )是無用且不必要的:它們被忽略。

但是,在您的 makefile 中,您沒有列出one.cpptwo.cpp作為main.o的先決條件,這意味着當您修改這些源文件時main.o不會更新,因此沒有任何變化。 如果刪除main.o ,則會重新編譯它並獲得新的行為。

暫無
暫無

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

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