我在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
我还注意到,使用其他静态库也可以,所以我的猜测是我的静态库有问题。如何找出问题所在?
答案 0 :(得分:0)
发现了问题:静态库与-pie
链接(它从android构建中滑入)。无需-pie
即可重建静态库。
尽管如此,还是要感谢宝贵的提示