4

我有一个共享库(目前正在编译、加载和运行)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自动生成的代码。

4

1 回答 1

3

它适用于我一个简单的 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>)

源.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() {
}

一些文档

于 2016-05-11T11:59:40.510 回答