遇到此错误时,我试图在python脚本中使用C函数:
Undefined symbols for architecture x86_64:
"_PyList_Append", referenced from:
_count_arr in mi1-5e9b85.o
"_PyList_New", referenced from:
_count_arr in mi1-5e9b85.o
"_Py_BuildValue", referenced from:
_count_arr in mi1-5e9b85.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
.cpp文件是:
#include <cstring>
#include <iostream>
//#include <Python.h>
#include "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/include/python3.6m/Python.h"
#include <vector>
#ifdef __cplusplus
extern "C" PyObject* count_arr(char** arr, unsigned n2, char* word)
#else
PyObject* count_arr(char** arr, unsigned n2, char* word)
#endif
{
PyObject * PList = PyList_New(0);
vector <int> intVector;
for(unsigned j = 0; j < n2; j++)
{
if(strstr(arr[j], word) != NULL) {intVector.push_back(j);}
}
vector<int>::const_iterator it;
for(it = intVector.begin(); it != intVector.end() ; it++ )
{
PyList_Append(PList, Py_BuildValue("i", *it));
}
return PList;
}
如果尝试包含Python.h,则会收到有关缺少此标头的消息。操作系统是macos。
答案 0 :(得分:0)
我找到了答案:如果您使用clang,则需要传递
clang mi.o -I/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/include -lpython3.6 -L /usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib
但是,如果您使用g ++,则需要使用命令
g++ -fPIC -c mi1.cpp -o mi.o -I/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/include/python3.6m/
g++ -shared -lpython3.6 -L /usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib -olibmi.so mi.o