其實我有一個庫'cryptopp',我想要的是,當我對文件進行任何更改併發出make
命令時,它應該照顧變化在源目錄中的任何文件中創建。那麼,cryptoopp的GNUMakefile會處理'.cpp'文件中的'if'更改,但不處理'.h'文件中所做的更改。如何編寫makefile來處理頭文件中的更改
那麼我可以在cryptopp的'GNUMakefile'中做什麼修改,以便它查看所有修改過的頭文件並重新編譯所有依賴於'modified'頭文件的文件。
其實我有一個庫'cryptopp',我想要的是,當我對文件進行任何更改併發出make
命令時,它應該照顧變化在源目錄中的任何文件中創建。那麼,cryptoopp的GNUMakefile會處理'.cpp'文件中的'if'更改,但不處理'.h'文件中所做的更改。如何編寫makefile來處理頭文件中的更改
那麼我可以在cryptopp的'GNUMakefile'中做什麼修改,以便它查看所有修改過的頭文件並重新編譯所有依賴於'modified'頭文件的文件。
如果你使用g ++構建你可以讓G ++生成生成文件扶養。 你可以將這些包含在主makefile中。
使用-M和-M *參數來使用此功能。 (請參閱http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Preprocessor-Options.html#Preprocessor-Options)
你必須所有的依賴添加到您的Makefile:
mycode.o: mycode.cpp mycode.h somelib.h resources.h
$(CXX) -c -o [email protected] $< $(CXXFLAGS) $(INCLUDES)
如果你已經有了一個通用的模式匹配的命令行,你不必再命令說,你可以列出的依賴關係:
%o: %.cpp
$(CXX) -c -o [email protected] $< $(CXXFLAGS) $(INCLUDES)
mycode.o: mycode.cpp mycode.h somelib.h resources.h
yourcode.o: yourcode.cpp yourcode.h mycode.h somethingelse.h
# ...
一般來說,這是一個可怕的和不可擴展的混亂。幾乎肯定會想要一個更高級別的構建系統爲您生成Makefile。即使對於非常小的項目來說,在Makefile中保持頭文件依賴性是最新的,這是一件非常痛苦的事情,它根本就不值得。
有幾種流行的可移植構建環境。我個人很喜歡cmake
,其中包括髮現如果您更改了構建設置(例如從調試到發佈)並且將始終構建所有必需的文件(例如,如果更改cmake主文件並鍵入「make」它會首先自動爲你再次運行cmake)。
對於您可以嘗試makedepend
,或臭名昭著的autotools
Unix的唯一的解決辦法,儘管這完全是另外一個頭疼......
這是一團糟。這就是爲什麼使用'.depend'文件(由編譯器自動生成)... –
如果安裝在您的系統上,您可以嘗試'makedepend'。最簡單的方法是將一個目標添加到您的生成文件。例如:
depend:
makedepend *.cc
您可能需要用源文件列表替換'* .cc'。然後你可以用'make depend'命令重新生成所有的依賴關係。您可能希望將錯誤消息重定向到/ dev/null,因爲它似乎總是產生大量噪音。
感謝您的答案,這真的很有幫助 –