ctypes,添加静态库时未定义的符号

时间:2018-07-12 14:51:35

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

我在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

我还注意到,使用其他静态库也可以,所以我的猜测是我的静态库有问题。如何找出问题所在?

1 个答案:

答案 0 :(得分:0)

发现了问题:静态库与-pie链接(它从android构建中滑入)。无需-pie即可重建静态库。

尽管如此,还是要感谢宝贵的提示