Linux下C++调用python,gcc和eclipse的编译方法

继上一篇Linux下安装python的文章之后,又遇到新问题,在linux下C++调用python如何编译,或者用IDE时候需要哪些配置。
先看最简单的代码段

//test_cpp_python.cpp
#include "Python.h"
#include 
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编译报错
Linux下C++调用python,gcc和eclipse的编译方法_第1张图片
经网上搜索,确实很可能是没加入对应的库文件导致的。
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++,添加头文件路径,见上述
Linux下C++调用python,gcc和eclipse的编译方法_第2张图片

**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
Linux下C++调用python,gcc和eclipse的编译方法_第3张图片
build一下发现还是报上述错误,感觉libpython2.7.a应该是有用的,但加入到Project->Properties->C/C++ General->Paths and Symbols->library里,报另一个错误
Linux下C++调用python,gcc和eclipse的编译方法_第4张图片
最终删除这个路径,在Project->Properties->C/C++ Build->Settings->GCC C++ Linker->Miscellaneous中加入/usr/local/python2.7.11/lib/python2.7.a
再次build,ok了!
耗时7个小时解决了这个问题,Mark一下!

你可能感兴趣的:(python学习)