我需要创建一个与另一个共享对象链接的共享对象 (.so)(我的代码使用该共享对象导出的函数/符号)。无论我尝试什么,CMake / G++ / LD 都拒绝在链接操作中包含共享对象。
具体来说,我正在为 MariaDB CONNECT 引擎实现一个 OEM 表类型。我尝试使用这些 CMake 指令及其随附的指令并取得零成功:
link_directories()
add_library()
find_library()
target_link_libraries()
我完全不知所措。我的代码确实compile,并且根据设置似乎链接,但是当我检查时总是缺少 ha_connect.so 依赖项,因此在加载时会引发未定义的符号错误。
我已经尝试争取 Olivier Bertrand(CONNECT 维护者)的帮助。有问题的代码显然在 Windows 下编译、链接和运行都没有问题,这让他对阻止它在 Linux 下链接的问题有点茫然。
我当前的 CMakeLists.txt 在链接过程中编译和链接时不会抛出错误,如下所示:
cmake_minimum_required(VERSION 3.10)
project(data_flex VERSION 0.9 DESCRIPTION "DataFlex lib for Maria Connect")
include(GNUInstallDirs)
file(GLOB_RECURSE sources src/*.cpp include/*.h)
add_library(data_flex SHARED ${sources})
target_include_directories(data_flex PRIVATE include)
set_target_properties(data_flex PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 0.9
PUBLIC_HEADER include/DataFlex.h)
target_compile_options(data_flex PUBLIC -std=c++1y -Wall -Wfloat-conversion)
当实际加载 .so 时,它仍然会引发未定义的符号错误。追查那些符号应该在哪里,它们都位于 ha_connect.so 中。我知道上面的 CMakeLists.txt 不包含对 ha_connect.so 的引用,但我现在在机场,无法访问我目前尝试过的其他版本。(为回应-kanstar而编辑(为我之前的遗漏道歉))