【发布时间】: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