继上一篇Linux下安装python的文章之后,又遇到新问题,在linux下C++调用python如何编译,或者用IDE时候需要哪些配置。
先看最简单的代码段
//test_cpp_python.cpp
#include "Python.h"
#include <iostream>
using namespace std;
int main()
{
Py_Initialize();
PyRun_SimpleString("print('Python')");
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
Py_Finalize();
return 0;
}
根据之前windows下联合编程时候在vs2010下的配置的经验,我们需要将头文件和库文件加入编译的路径。
1. 头文件:这个好找,根据安装的目录找到即可,我装的是
/usr/local/python2.7.11/include/python2.7
这里需要注意,最后的python2.7这个文件夹不能省。
2. 库文件:在windows下库文件路径为python27_d.dll所在的路径python27/libs/,而与之对应的linux下是什么文件在网上怎么也没找到。
先随便加了几个库/usr/lib, /usr/lib64, /usr/local/python2.7.11/lib/等,都不行,在没有加入正确的库之前,用eclipse编译报错
经网上搜索,确实很可能是没加入对应的库文件导致的。
1. g++解决方案
想着这种问题搜不到,但是python的官网应该会有相应的解释,于是在官网上找到这个Compiling and Linking under Unix-like Systems,按照这里的介绍,进入python的库文件夹下/usr/local/python2.7.11/bin/下,分别输入以下两个命令
./python-config --cflags
./python-config --ldflags
分别得到
-I/usr/local/python2.7.11/include/python2.7 -I/usr/local/python2.7.11/include/python2.7 -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
和
-L/usr/local/python2.7.11/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic
以上两条结果是python根据当前系统和python安装路径推荐的编译时输入头文件命令(-I表示要包含的头文件目录),库目录(-L表示要包含的库文件目录)和库文件名(-l表示库文件名)等。同时,官网表示以上并不保证对所有与Unix类似的平台都有效。
还可以进入python用一下方法得到需要的库
import sysconfig as s
s.get_config_var('LIBS')
s.get_config_var('LINKFORSHARED')
于是使用如下命令编译、连接
g++ -o test test_cpp_python.cpp -I/usr/local/python2.7.11/include/python2.7 -I/usr/local/python2.7.11/include/python2.7 -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -L/usr/local/python2.7.11/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic
有两个warning,但没有error,ls看到有test的可执行文件,
./test
Python
!!!Hello World!!!
进一步测试,
[root@centos src]# g++ -o test test_cpp_python.cpp -I/usr/local/python2.7.11/include/python2.7 -L/usr/local/python2.7.11/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm
这样也可以,甚至减去”-lm”也可以,再减其他的则不行了。
更新::去掉-Xlinker后,会出现某些symbol找不到的问题,如这里说的,我在使用c++调用py文件的时候出现该问题,加入-Xlinker后解决!
2. eclipse解决方案
**a) 加入头文件:**Project->Properties->C/C++ General->Paths and Symbols,langues选择GNU C++,添加头文件路径,见上述
**b) 加入库文件:**Project->Properties->C/C++ Build->Settings->GCC C++ Linker,分为(-l)和(-L)两个
在-l中加入dl, pthread, m, util四个,在-L中加入/usr/local/python2.7.11/lib/python2.7/config
build一下发现还是报上述错误,感觉libpython2.7.a应该是有用的,但加入到Project->Properties->C/C++ General->Paths and Symbols->library里,报另一个错误
最终删除这个路径,在Project->Properties->C/C++ Build->Settings->GCC C++ Linker->Miscellaneous中加入/usr/local/python2.7.11/lib/python2.7.a
再次build,ok了!
耗时7个小时解决了这个问题,Mark一下!
本文介绍了在Linux下C++调用Python的编译问题及解决方法,包括通过g++手动编译和在Eclipse中进行配置。在g++编译时需添加头文件和库文件路径,Eclipse中则需在C/C++ General的Paths and Symbols以及C/C++ Build的Settings中进行相应设置,以解决链接错误。

532

被折叠的 条评论
为什么被折叠?



