2017-03-15 577 views
2

我有一個已編譯的庫C++(我們稱之爲a.so),它有Boost庫符號鏈接在其中,我沒有源代碼重新編譯它。CMake:如何從預編譯的庫中隱藏符號

我已經做了一個C++程序,它需要鏈接到這個庫和我的電腦上安裝的增強版本。

但是當我的程序嘗試達到升壓功能時,它最終會調用a.so中定義的升壓功能,而不是我電腦上的升壓功能。

我試過在a.so左右製作一個包裝庫來隱藏不需要的符號,但是它無法編譯。

如何配置CMake使其構建和工作,有無包裝?

該解決方案需要與Linux兼容。

+0

您是否嘗試過動態鏈接庫文件而不是靜態鏈接庫a.so? – oLen

+0

沒有,因爲提到我沒有資源重新編譯它。 – Sisyphe

回答

0

您可以使用add_custom_command,創建一個PRE_LINK步驟,該步驟將從a.so中刪除升壓功能。你可以把它寫到一個新文件中(並且改變你在CMake中鏈接的那個.so),或者覆蓋它。

這可以通過objcopy實用程序和--strip-symbols參數完成。假設有很多提升符號要刪除,在a.so上使用nm,並將提升符號過濾爲文件可能比較謹慎。

+0

謝謝,我會試試看。 – Sisyphe