C++将静态库链接到共享库
问题描述:
我正在尝试在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。它适用于我,但是当我试图包含第三方库时,我被卡住了。
如果任何人都可以指出解释如何在插件中使用第三方库的资源,那就太棒了!
答
已解决!
我把这个添加到我的cmake文件set(CMAKE_POSITION_INDEPENDENT_CODE ON)
这是错误信息试图告诉我(用-fPIC
编译)。
我做到了,现在我可以将我的插件与静态库链接起来。
就像链接可执行程序一样链接共享库。你为共享库注释掉了'target_link_libraries',如果你真的让CMake运行它,会发生什么? –
我试过了,但是我得到这个错误'/ usr/bin/ld:deps_build/dlib_build/libdlib.a(logger_kernel_1.cpp.o):在创建共享对象时,无法使用'.bss'重定位R_X86_64_32;使用-fPIC重新编译 – azmath
好的,这是一个问题。那么你需要告诉我们你如何*加载*“插件”?请创建一个[最小,完整和可验证示例](http://*.com/help/mcve)并向我们展示。 –