CMake "OBJECT" 库:叮当未正确链接
CMake "OBJECT" library: clang not linking properly
我有一个共享库(当前编译、加载和运行)mylib.so
。在这个库中,我想使用一个新函数(将它注册到另一个外部库中)。签名为bool my_function(const QVariant *, PyObject **)
。
这个新函数在一个单独的.cpp文件中定义,该文件被编译为一个对象,然后链接到mylib.so
。
所以我用我的自定义功能创建了一个新的OBJECT
ADD_LIBRARY(helper_lib OBJECT helper_lib.cpp)
在构建我的图书馆时包括这一点
ADD_LIBRARY(mylib SHARED source.cpp $<TARGET_OBJECTS:helper_lib>)
它以"对`my_function'的未定义引用"失败
我可以看到
- 生成
helper_lib.o
文件 nm helper_lib.o
显示0000000000000000 T _Z11my_functionPK8QVariantPP7_object
nm mylib.o
显示U my_function
helper_lib.o
被传递到clang++:clang++ -fPIC [...] -o my_lib.so mylib.o helper_lib.o [...]
我努力想知道错误发生在哪里。我可以想象,mylib.o
中有一些错误,它显示了一个无法与helper_lib.o
符号名称匹配的未映射符号名称,但我也可能完全错误。
helper_lib.h
void my_function();
helper_lib.cpp
#include "helper_lib.h"
void my_function()
{
return;
}
source.cpp比较复杂,因为它主要包含sip自动生成的代码。
它对我来说适用于一个简单的source.cpp。所以在包含过程中一定有什么问题,你可以尝试将#include "helper_lib.h
移动到source.cpp的顶部。
为了验证这与你的工具链无关,你可以从一个干净的构建目录中尝试以下项目:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.3)
project(dummy)
ADD_LIBRARY(helper_lib OBJECT helper_lib.cpp)
ADD_LIBRARY(mylib SHARED source.cpp $<TARGET_OBJECTS:helper_lib>)
source.cpp:
#include "helper_lib.h"
void dummy() {
my_function();
}
helper_lib.h:
#pragma once
void my_function();
helper_lib.cpp:
#include "helper_lib.h"
void my_function() {
}
一些文档。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- VS 链接器失败,标准::字符串方法出现"object already exists"错误
- CMake "OBJECT" 库:叮当未正确链接
- g++文件格式无法识别;将Object.o视为链接器脚本
- 使用Boost::Python::Object会导致链接器错误
- 未定义对Base::object链接器错误@c++w/freeglut的引用
- 链接错误:"relocation R_X86_64_32 ... can not be used when making a shared object; recompile with -fPIC"