CMake“OBJECT”库:clang没有正确链接

时间:2016-05-11 11:26:19

标签: c++ linker cmake python-sip

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

1 个答案:

答案 0 :(得分:2)

它适用于简单的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() {
}

一些documentation

相关问题