我從相同的C源文件 - 可執行文件和共享庫構建兩個目標。共享庫需要代碼可重定位(使用-fPIC編譯),但由於各種原因,我無法在可執行文件中使用可重定位代碼。有沒有一種標準/常用的方法來處理Makefile中的這種情況?Makefile:來自相同源的兩個目標使用不同標誌編譯兩次
1
A
回答
1
我建議你有兩個目錄中的目標文件,一個標準的對象和一個用於可重定位對象。事情是這樣的:
$(STANDARD_OBJS) = $(addprefix $(STANDARD_OBJS_DIR)/, $(OBJS))
$(RELOC_OBJS) = $(addprefix $(RELOC_OBJS_DIR)/, $(OBJS))
$(RELOC_OBJS_DIR)/%.o: CCFLAGS += -fPic
$(RELOC_OBJS_DIR)/%.o $(STANDARD_OBJS_DIR)/%.o: $(SRC)/%.cc
g++ $< -o [email protected]
(還有更復雜的變化,但是這將讓你開始)
0
注入一些規則,以便您的二進制版本的目標依賴並使用static_lib。
shared_lib:whatever.so ...
static_lib:whatever.a ...
二進制:static_lib
相關問題
- 1. makefile編譯多個源,標誌不同
- 2. Makefile來自同一源文件的多個目標,具有不同的標誌
- 3. Makefile - 兩個不同的目標
- 4. Makefile編譯兩次不同定義
- 5. 用不同的標誌打開兩次相同的文件?
- 6. 源文件具有不同編譯器標誌的Makefile
- 7. 使用CMAKE編譯具有不同標誌的相同文件
- 8. 兩個目標具有相同名稱的一個Makefile
- 9. 具有兩個具有相同名稱的目標的Makefile
- 10. SQL使用相同的字段兩次以不同的標準
- 11. 不同編譯標誌爲同一個文件在不同的目標
- 12. Makefile:多個目標的相同規則
- 13. 如何在LabVIEW中編譯用於編譯標誌的不同目標的VI?
- 14. 使用rsync將兩個源目錄同步到兩個不同的目標目錄
- 15. JS使用來自兩個不同來源的功能
- 16. 點擊相同的標記兩次打開兩個InfoWindows
- 17. icecast2。兩個來源,相同的流
- 18. 在不同的編譯單元中編譯具有不同編譯標誌的相同頭文件
- 19. 在不同訪問標誌的同一文件上使用fopen兩次
- 20. 如何調用兩次相同的msbuild目標?
- 21. Makefile爲兩個編譯器和不同的優化技術
- 22. 是否有可能使用不同於非託管源的編譯器標誌來編譯託管源?
- 23. Makefile文件 - 編譯到不同的目標文件夾
- 24. 如何編譯相同的源代碼生成不同的目標文件?
- 25. 匹配來自兩個不同表的兩個不同的列
- 26. 來自不同類的方法兩次
- 27. 鏈接來自不同C編譯器的目標文件
- 28. 如何使用SCons編譯兩個不同的編譯器?
- 29. 來自兩個不同目錄的兩個文件的差異
- 30. CMake:使用兩個不同編譯器進行交叉編譯,但源碼相同
有幾種方法。我會說最乾淨的是有兩個目錄文件的目錄,一個用於標準對象,另一個用於可重定位。這可以接受嗎? – Beta
我同意Beta,將所有中間文件等構建到兩個單獨的目錄中。這樣,所有的Makefile目標都有獨立的名字(儘管你當然可以使用Make通配符來避免代碼重複)。 –
謝謝,夥計們!你們是否願意把它寫成答案,以便我能接受它? – sudarkoff