簡體   English   中英

C ++共享庫創建-與其他共享庫鏈接

[英]C++ Shared library creation - linking against other shared libraries

我正在創建一個C ++共享庫,該庫鏈接到一些Boost庫(本地計算機上的Boost版本為1.55)。

我可以在我的機器上使用我的庫,但是由於未定義的引用,因此無法在具有不同版本的Boost(比如1.54)的另一個系統上使用它。

我正在使用CMake,這里是CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8)
project(my_library)

set(CMAKE_BUILD_TYPE Release)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

FILE(GLOB_RECURSE INCLUDE_FILES "include/*.hpp")
FILE(GLOB_RECURSE SOURCE_FILES "src/*.cpp")

add_library(${PROJECT_NAME} SHARED ${INCLUDE_FILES} ${SOURCE_FILES})

target_link_libraries(${PROJECT_NAME} -pthread -lboost_filesystem -lboost_regex -lboost_system)

我是圖書館創建的新手,在這個問題上我努力了好幾天。 我想知道是否必須創建一個內部包含Boost的靜態庫。 但是我希望我的圖書館盡可能小。

編輯:當我檢查我的lib依賴項時,我得到了Boost regex的文件: libboost_regex.so.1.55.0 => /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.55.0 (0x00007fe228a27000)

是否可以將其更新為不鏈接到特定版本的Boost?

當您鏈接到諸如Boost的共享庫時,至關重要的是,運行時實際加載的庫的ABI必須與編譯和鏈接時使用的ABI兼容。 Boost在版本之間不維護ABI兼容性。 這就是為什么嚴格依賴特定的Boost版本的原因。 無法構建與其使用的Boost版本不相關的可執行文件或庫。

在Linux世界中,開源代碼是正常的,這樣就可以為每個Linux發行版單獨地對其進行編譯。 這樣,在編譯和運行時使用的Boost版本將是相同的-發行版維護人員將交付的Boost版本。

如果開放源代碼模型不適合您,則可以為自己的軟件包構建用於不同Linux發行版的軟件包,或者嘗試以某種方式隱藏依賴項。 后者的一種方法是將您的庫構建為共享對象,但與Boost的靜態庫鏈接。 但是,您必須非常小心,不要在任何公共接口中公開Boost,也不要從庫中導出任何Boost符號。 這包括類型信息,因此無法從您的庫中引發Boost異常。 基本上,使用Boost的事實必須對庫用戶絕對隱藏。 否則,將很難解決您的Boost和庫用戶可能使用的Boost之間的沖突。

請注意,對於某些Boost庫,甚至不能選擇靜態鏈接,因為在某些配置中可能需要與共享庫鏈接。 您應該查閱所使用的每個Boost庫的文檔,以查看是否存在此類約束。

您不應該創建靜態庫,因為它只是目標文件的存檔。 此外,靜態庫不是由編譯器創建的,它是使用弓形工具創建的

ar cr libtemp.a obj/*.o

相反,編譯器支持共享庫。

g++ -fPIC -shared *.o -o libtemp.so

您可以使用“ nm”,“ ldd”和“ objdump”之類的工具檢查庫中的符號。

閱讀有關鏈接器和加載器的信息,它將使您對該主題有更好的了解。

同樣,CMAKE的標准做法是使用find_package而不是喜歡Directlty。

find_package (Threads)
find_package(Boost,file_system,regex,system)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT} ${BOOST_LIBS})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM