2017-10-17 219 views
0

我正在嘗試在C++中構建一個基於插件的應用程序。C++將靜態庫鏈接到共享庫

我有兩個目標 - 基礎和插件。

這是做的主要工作

# Executables 
# build plugin 
file (GLOB SRCP "plugin/*.?pp") 
include_directories(plugin/) 
MESSAGE (STATUS "SRC: " "${SRCP}") 
add_library(testplugin MODULE ${SRCP}) 
add_dependencies(testplugin ${DEPS_TARGETS}) 
#target_link_libraries(testplugin dlib::dlib) 
#build main 
file(GLOB SRC "*.?pp") 
message(STATUS "SRC: " "${SRC}") 
add_executable(exec ${SRC}) 
add_dependencies(exec ${DEPS_TARGETS}) 
target_link_libraries(exec dlib::dlib) 

它成功地建立,但是當我嘗試加載的插件,它失敗,此錯誤

Error: Cannot load library: libtestplugin.so: undefined symbol: _ZN4dlib6loggerD1Ev

我的CMakeLists.txt的一部分中符號對應於插件中的語句dlib::logger dlog("main.abstract_cnn");

dlib是一個靜態庫,我在基礎和插件中都使用它。 我把這個庫鏈接到基礎應用程序,但我不知道如何鏈接它到一個庫/模塊?基礎應用程序不會將符號傳遞給插件嗎?在這種情況下我能做些什麼?

我還想要一個跨平臺的解決方案。主要是linux + windows。

任何人都可以建議嗎?請?

我如何加載 我正在使用名爲Libsourcey的庫,該庫有一個名爲pluga的模塊,用於輕鬆加載。我的程序是這裏給出的基本測試程序pluga。它適用於我,但是當我試圖包含第三方庫時,我被卡住了。

如果任何人都可以指出解釋如何在插件中使用第三方庫的資源,那就太棒了!

+0

就像鏈接可執行程序一樣鏈接共享庫。你爲共享庫註釋掉了'target_link_libraries',如果你真的讓CMake運行它,會發生什麼? –

+0

我試過了,但是我得到這個錯誤'/ usr/bin/ld:deps_build/dlib_build/libdlib.a(logger_kernel_1.cpp.o):在創建共享對象時,無法使用'.bss'重定位R_X86_64_32;使用-fPIC重新編譯 – azmath

+0

好的,這是一個問題。那麼你需要告訴我們你如何*加載*「插件」?請創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示。 –

回答

1

已解決!

我把這個添加到我的cmake文件set(CMAKE_POSITION_INDEPENDENT_CODE ON)這是錯誤信息試圖告訴我(用-fPIC編譯)。
我做到了,現在我可以將我的插件與靜態庫鏈接起來。