2017-10-17 220 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编译)。
我做到了,现在我可以将我的插件与静态库链接起来。