CMake "OBJECT" 库:叮当未正确链接

CMake "OBJECT" library: clang not linking properly

本文关键字:链接 OBJECT CMake 叮当      更新时间:2023-10-16

我有一个共享库(当前编译、加载和运行)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() {
}

一些文档。