我有幾個使用對方的庫。無論何時我構建它們,我需要定義預處理器定義以確保使用正確的可見性修飾符(例如,Windows中的dllimport/dllexport會說)。
所有庫都使用相同的生成文件,也就是說,它們共享規則,CFLAGS等。所有這些庫只根據輸入文件列表的不同而不同,其餘的庫文件由庫共享。
共享的Makefile有一個包含所有庫的列表中的變量,像這樣:makfile變量擴展
MODULE_LIBS = liba123 libb456 libc999
然後,我需要這些預處理器定義了每個庫的啓用:
For liba123: -Da123_EXPORTS
For libb456: -Db456_EXPORTS
For libc999: -Dc999_EXPORTS
這些庫中的每一個都存在於它們各自的子庫中,這些庫都是庫本身的名稱(例如liba123,libb456等)。 所以,我寫信給啓用這些出口定義了基於文件的路徑正在編譯這個Makefile招:
%的.o:%.c的
$(CC)$(CPPFLAGS)$( CFLAGS)-D $(過濾器$(MODULE_LIBS),$(SUBST LIB,$(SUBST /,$ @)))_日出口 -c -o $ @ $ <
我要補充('-D $(filter $(MODULE_LIBS),$(subst lib,$(subst /,$ $)))_ EXPORTS'),因爲我有很多類似的規則。所有這些不同的規則都無法完成,但是他們有一個共同點:$(CPPFLAGS)。
問題出在這裏。我可以在CPPFLAGS中添加「-D $(filter $(MODULE_LIBS),$(subst lib,,$(subst /,$ $)))__ EXPORTS」,以便所有這些makefile變量只能在原地擴展它在哪裏使用?
我想我做到了我前面提到的方式。我只需使用*遞歸擴展*而不是*簡單的可變擴展*。這樣,所有的自動裝置都不會擴展,直到執行規則。我之所以沒有按照你提到的方式去做,是因爲模塊和makefile的列表是第三方產品,它一直在改變。 – Pavel 2012-07-27 18:45:41