g ++用python.h,如何编译 [英] g++ with python.h, how to compile
问题描述
我用g ++编译一个测试代码,没有任何问题。
#include h
int main(int argc,char ** argv)
{
Py_Initialize();
PyRun_SimpleString(import pylab);
PyRun_SimpleString(pylab.plot(range(5)));
PyRun_SimpleString(pylab.show());
Py_Exit(0);
}
g ++ -o test test.cpp -I / usr / include / python2.7 / -lpython2.7
可以正常运行。
但是当我尝试嵌入这个代码到另一个项目中,它失败。
CXX = g ++
CXXFLAGS = -DIB_USE_STD_STRING -Wall -Wno-switch -g
ROOT_DIR = ..
BASE_SRC_DIR = $ {ROOT_DIR} / PosixSocketClient
INCLUDES = -I $ {ROOT_DIR } / Shared / -I $ {BASE_SRC_DIR} -I / usr / include / python2.7
LIBRARY = -L / usr / lib / python2.7 / config
TARGET = eu
$(TARGET):
$(CXX)$(CXXFLAGS)$(INCLUDES)-o EClientSocketBase.o -c $(BASE_SRC_DIR)/EClientSocketBase.cpp
$(CXX)$(CXXFLAGS )$(INCLUDES)-o EPosixClientSocket.o -c $(BASE_SRC_DIR)/EPosixClientSocket.cpp
$(CXX)$(CXXFLAGS)$(INCLUDES)-o PosixTestClient.o -c PosixTestClient.cpp
$(CXX)$(CXXFLAGS)$(INCLUDES)-o Main.o -c Main.cpp
$(CXX)$(LIBRARY)-lpython2.7 -o $ @ EClientSocketBase.o EPosixClientSocket.o PosixTestClient。 o Main.o
clean:
rm -f $(TARGET)* .o
这个项目编译精细和运行,我做的唯一的更改是在Main.cpp文件中添加测试代码。警告/错误消息显示:
在/usr/include/python2.7/Python.h:8:0, br>
从Main.cpp:15:
/usr/include/python2.7/pyconfig.h:1158:0:warning:_POSIX_C_SOURCE重新定义[默认启用]
/usr/include/features.h:163:0:注意:这是上一个定义的位置
/usr/include/python2.7/pyconfig.h:1180: 0:警告:_XOPEN_SOURCE重新定义[默认启用]
/usr/include/features.h:165:0:注意:这是上一个定义的位置
g ++ -L / usr / lib / -lpython2.7 -ldl -lutil -o eu EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o Main.o
Main.o:In functionmain':
Py_Initialize'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81:未定义引用
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:82:未定义的引用PyRun_SimpleStringFlags'
PyRun_SimpleStringFlags'
/ home / bbc / TWS / IBJts / cpp / eu-ats / Main.cpp:83:未定义的引用
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:84:未定义引用PyRun_SimpleStringFlags'
Py_Exit '
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85:未定义引用
collect2:ld退回1退出状态
make: * [eu]错误1
有什么帮助吗?
查看Lucas对于答案的意见:
为了摆脱_POSIX_C_SOURCE警告,请确保在所有其他头文件之前包含Python.h。
我有同样的问题。我使用Boost Python,所以对我来说,我将boost / python.hpp的include包含在我的.cpp文件的第一行。
(Lukas,一个答案,所以请求的人可以标记为正确的答案,这个问题不会在StackOverflow中保持未回答。)
I compile one test code with g++ without any issue.
#include "Python.h"
int main(int argc, char** argv)
{
Py_Initialize();
PyRun_SimpleString("import pylab");
PyRun_SimpleString("pylab.plot(range(5))");
PyRun_SimpleString("pylab.show()");
Py_Exit(0);
}
g++ -o test test.cpp -I/usr/include/python2.7/ -lpython2.7
works fine and runs.
But when I try to embed this code into another project, it fails. It really confuses me.
Makefile is like the following.
CXX=g++
CXXFLAGS=-DIB_USE_STD_STRING -Wall -Wno-switch -g
ROOT_DIR=..
BASE_SRC_DIR=${ROOT_DIR}/PosixSocketClient
INCLUDES=-I${ROOT_DIR}/Shared/ -I${BASE_SRC_DIR} -I/usr/include/python2.7
LIBRARY=-L/usr/lib/python2.7/config
TARGET=eu
$(TARGET):
$(CXX) $(CXXFLAGS) $(INCLUDES) -o EClientSocketBase.o -c $(BASE_SRC_DIR)/EClientSocketBase.cpp
$(CXX) $(CXXFLAGS) $(INCLUDES) -o EPosixClientSocket.o -c $(BASE_SRC_DIR)/EPosixClientSocket.cpp
$(CXX) $(CXXFLAGS) $(INCLUDES) -o PosixTestClient.o -c PosixTestClient.cpp
$(CXX) $(CXXFLAGS) $(INCLUDES) -o Main.o -c Main.cpp
$(CXX) $(LIBRARY) -lpython2.7 -o $@ EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o Main.o
clean:
rm -f $(TARGET) *.o
This project compiles fine and runs, the only change I made was adding the test code in the Main.cpp file. warning/error message shows:
In file included from /usr/include/python2.7/Python.h:8:0,
from Main.cpp:15:
/usr/include/python2.7/pyconfig.h:1158:0: warning: "_POSIX_C_SOURCE" redefined [enabled by default]
/usr/include/features.h:163:0: note: this is the location of the previous definition
/usr/include/python2.7/pyconfig.h:1180:0: warning: "_XOPEN_SOURCE" redefined [enabled by default]
/usr/include/features.h:165:0: note: this is the location of the previous definition
g++ -L/usr/lib/ -lpython2.7 -ldl -lutil -o eu EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o Main.o
Main.o: In functionmain':
Py_Initialize'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:82: undefined reference toPyRun_SimpleStringFlags'
PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:83: undefined reference to
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:84: undefined reference toPyRun_SimpleStringFlags'
Py_Exit'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
collect2: ld returned 1 exit status
make: * [eu] Error 1
any help? thank you!
Take a look at Lucas's comment for the answer:
"To get rid of the _POSIX_C_SOURCE warning, make sure to include Python.h before all other header files."
I had the same problem. I use Boost Python, so for me I moved the include of boost/python.hpp to the first line in my .cpp file.
(Lukas, post your comment as an answer so the person who asked can mark it as the right answer, and the question won't remain 'unanswered' in StackOverflow.)
这篇关于g ++用python.h,如何编译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!