在我的項目中,存在來自第三方的對靜態庫(從現在開始稱爲libsomething
)的依賴關係。最近,libsomething
已成爲另一個版本。我的任務是爲我的軟件提供對舊版和新版的支持。 libsomething
在任何給定時間僅在運行時使用一個版本,但在程序運行之間應配置哪個版本。在動態庫中包裝不同版本的靜態庫
我在WinXP上使用MSVC2005,第二個目標是準備切換到Linux和GCC。
因爲libsomething
的兩個版本都使用相同的符號,所以將它們鏈接到我的可執行文件中是不可能的,因爲這兩個版本的符號都會在鏈接時發生衝突。雖然我可以創建兩個可執行文件(一個與舊版本鏈接,另一個使用新版本),但我無法實現在最終部署環境中調用哪個可執行文件(遺留原因)的決定。
我想出了爲libsomething
的每個版本創建一個動態庫包裝的想法,並根據一些配置文件在運行時鏈接它們。對於MSCV來說,這意味着要走上使用LoadLibrary()
,GetProcAddress()
等的道路,而在Linux上我將不得不使用dlopen()
和dlsym()
。
據我所知,使用libtool
(即libtldl
)正在包裝這個平臺依賴項以使用共享庫。這是一條適合的路徑嗎?有更好的(或者至少是不同的)方式嗎? libtldl
的替代方案是否以開源方式存在?
是的,這幾乎是我在2010年完成的事情。所以,我想這使得它成爲可接受的解決方案。 :-) – fawick 2017-12-07 19:23:47