【问题标题】:ctypes, undefined symbols when adding a static libraryctypes,添加静态库时未定义的符号
【发布时间】:2018-07-12 14:51:35
【问题描述】:

我在 this 示例之后使用 ctypes 和 cmake 和 gcc -fPIC。

#include <iostream>

class Foo {
public:
    void bar() {
        std::cout << "fooo" << std::endl;
    }
};

extern "C" {
    Foo* Foo_new() {
        return new Foo();
    }

    void Foo_bar(Foo* foo) {
        foo->bar();
    }
}

这使用以下 cmake 脚本编译:

set(CMAKE_CXX_STANDARD 11)

SET(SOURCES
        foo.cpp)

add_library(foo SHARED ${SOURCES})

但是,如果我从我的项目 (target_link_libraries(foo otherlib)) 添加另一个静态库,我会从 ctypes 中得到错误:

from ctypes import cdll
lib = cdll.LoadLibrary("./libfood.so")
lib.Foo_new()

>> AttributeError: ./libfood.so: undefined symbol: Foo_new

但是我只是链接其他库,我实际上并没有使用它。 nm 还表示符号已定义:

$ nm libfood.so | grep Foo_new
000000000002650a T Foo_new

我还注意到,与其他静态库一起工作正常,所以我的猜测是我的静态库有问题。如何找出它的问题所在?

【问题讨论】:

  • 你是否也编译了你想用-fPIC链接的静态库?
  • 是的。然而,它有一些大的依赖关系(应该都是静态的,fPIC 也是如此),它们是使用不同的构建系统构建的。很难跟踪它们。有没有办法找出其中一个依赖项是否构建不正确?我之前使用过静态库,它工作正常,但我从未将它包含在共享库中。
  • nm -D libfood.so | grep Foo_new 的输出是什么?
  • 输出为空。如果没有添加的静态库,它的 000000000000094a T Foo_new
  • 您所做的涉及静态库的更改中的某些内容导致链接器从libfood.so 的动态符号表中省略Foo_new,因此它不会在动态链接中得到解决。您需要提供minimal reproducible example 来说明原因。

标签: c++ cmake linker shared-libraries static-libraries


【解决方案1】:

发现问题:静态库与-pie 链接(它从android 构建中滑入)。在没有-pie 的情况下重建静态库解决了它。

感谢您的宝贵提示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多