【发布时间】:2023-03-18 03:49:01
【问题描述】:
我正在尝试从cpp 文件构建一个共享对象库,该文件是一组简单的函数。我想用ctypes与python交互。
假设我有cpp 文件:
#include "print.h"
#include <vector>
#include <iostream>
#include <dlfcn.h>
void print_array(const std::vector<std::vector<float>> &A){
for(size_t i = 0; i < A.size(); i++) {
for(size_t j = 0; j < A[0].size(); j++) {
std::cout << A[i][j] << "\n";
}
}
}
和头文件
#ifndef ADD_H
#define ADD_H
#include <vector>
void print_array(const std::vector<std::vector<float>> &A);
#endif
我尝试构建
g++ -fpic -c print.cpp -o print.o
g++ -shared -o print.so print.o
然后在python中
from cytpes import cdll
print_lib = cdll.LoadLibrary("print.so")
一行
print_lib.print_array()
产量
AttributeError: ./print.so: undefined symbol: print_array
nm -D print.so
给出输出
0000000000201060 B __bss_start
U __cxa_atexit
w __cxa_finalize
0000000000201060 D _edata
0000000000201068 B _end
0000000000000c14 T _fini
w __gmon_start__
0000000000000898 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
0000000000000a50 T _Z11print_arrayRKSt6vectorIS_IfSaIfEESaIS1_EE
0000000000000bcc W _ZNKSt6vectorIfSaIfEE4sizeEv
0000000000000bf2 W _ZNKSt6vectorIfSaIfEEixEm
0000000000000b6a W _ZNKSt6vectorIS_IfSaIfEESaIS1_EE4sizeEv
0000000000000ba2 W _ZNKSt6vectorIS_IfSaIfEESaIS1_EEixEm
U _ZNSolsEf
U _ZNSt8ios_base4InitC1Ev
U _ZNSt8ios_base4InitD1Ev
U _ZSt4cout
U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
我在编译步骤中根本做错了什么?
【问题讨论】:
-
注意它是怎么说的,
undefined symbol: print_array。 print.so 中的符号似乎是_Z11print_arrayRKSt6vectorIS_IfSaIfEESaIS1_EE -
你被c++ ABI击中了。见stackoverflow.com/questions/1615813/…
标签: python c++ shared-libraries