gpt4 book ai didi

c++ - ctypes,添加静态库时 undefined symbol

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:27 25 4
gpt4 key购买 nike

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

我还注意到,对于其他静态库,这工作正常,所以我猜测我的静态库有问题。如何找出问题所在?

最佳答案

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

感谢宝贵的提示

关于c++ - ctypes,添加静态库时 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51308718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com