【问题标题】:C++ Linking Static Library against Shared LibraryC ++链接静态库与共享库
【发布时间】: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


【解决方案1】:

已解决!

我将此添加到我的 cmake 文件 set(CMAKE_POSITION_INDEPENDENT_CODE ON) 中,这是错误消息试图告诉我的内容(使用 -fPIC 编译)。
我这样做了,现在我可以将我的插件与静态库链接起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多