【发布时间】:2017-10-17 10:43:36
【问题描述】:
我正在尝试用 C++ 构建一个基于插件的应用程序。
我有两个目标 - 基础和插件。
这是我的 CMakeLists.txt 的一部分,主要工作
# 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 )
它构建成功,但是当我尝试加载插件时,它失败并出现此错误
错误:无法加载库:libtestplugin.so:未定义符号:_ZN4dlib6loggerD1Ev
该符号对应于插件dlib::logger dlog("main.abstract_cnn");中的一条语句
dlib 是一个静态库,我在基础和插件中都使用它。 我将此库链接到基础应用程序,但我不知道如何将其链接 到库/模块?基础应用程序不会将符号传递给插件吗?在这种情况下我该怎么办?
我还想要一个跨平台的解决方案。主要是linux+windows。
谁能给点建议?请问?
我是如何加载的 我正在使用一个名为 Libsourcey 的库,它有一个名为 pluga 的模块,以便于加载。我的程序是这里给出的基本测试程序pluga。它对我有用,但是当我尝试包含第 3 方库时,我被卡住了。
如果有人能指出解释如何在插件中使用 3rd 方库的资源,那就太好了!
【问题讨论】:
-
链接共享库就像链接可执行程序一样。您为共享库注释掉的
target_link_libraries,如果您真的让 CMake 运行它会发生什么? -
我试过了,但我收到了这个错误
/usr/bin/ld: deps_build/dlib_build/libdlib.a(logger_kernel_1.cpp.o): relocation R_X86_64_32 against '.bss' can not be used when making a shared object; recompile with -fPIC -
好的,这是个问题。那么您需要告诉我们您是如何加载“插件”的吗?请创建一个Minimal, Complete, and Verifiable Example 并向我们展示。
-
尝试使用
-rdynamic标志链接您的可执行文件,这可能会导出丢失的符号。 -
@MaximEgorushkin 你的意思是用那个标志编译基础吗?如何在 cmake 中指定?
标签: c++ gcc cmake linker shared-libraries