2016-03-04 55 views
0

我有兩個名稱衝突的來源(autogenerated1.cpp和autogenerated2.cpp)。cmake和部分鏈接來解決符號衝突

我不想修改它們,因爲它們是由第三方工具生成的,所以我使用包裝來隱藏實現。

我想要做這樣的事情上的CMake:

g++ -fvisibility=hidden -c autogenerated1.cpp 

g++ -fvisibility=hidden -c autogenerated2.cpp 

g++ -c wrapper1.cpp 

g++ -c wrapper2.cpp 

ld -Ur autogenerated1.o wrapper1.o -o partial1.o 

ld -Ur autogenerated2.o wrapper2.o -o partial2.o 

objcopy --localize-hidden partial1.o 

objcopy --localize-hidden partial2.o 

我怎麼能實現與CMake的類似的東西?

TARGET_OBJECT生成器不能用於自定義命令或自定義目標。

而且我無法通過將「objcopy --localize-hidden」應用於目標的輸出共享庫而無需可重定位中間對象來生成工作靜態庫。

我打開其他解決方案來解決符號衝突。

+2

也許只是一個想法,但而不是在編譯生成的文件,你能代替他們包裝在一個命名空間?即'命名空間autogen1 {#包括「autogenerated1.cpp」}'http://stackoverflow.com/questions/232693/including-one-c-source-file-in-another – Lanting

+0

真棒解決方法!它需要在包裝類的相同名稱空間內完成,以避免與wapped標頭衝突。 - 這也是一個跨平臺的解決方案。謝謝! – xvan

回答

1

很高興看到它適用於您的情況。現在作爲答案而不是回覆:

也許只是一個想法,而不是編譯生成的文件,你可以將它們包裝在命名空間中嗎?例如:

namespace autogen1 { 
#include "autogenerated1.cpp" 
} 

你會顯然需要從編譯排除自動生成的文件(如那些正在通過包括拉入),但你現在可以訪問兩個自動生成的文件中的所有成員,只需添加前綴調用適當的命名空間。

它看起來有點hackish(但不是那麼糟糕,因爲自己的解決方案;-))

Including one C source file in another?