簡體   English   中英

g++和python.h,如何編譯

[英]g++ with python.h, how to compile

我用 g++ 編譯了一個測試代碼,沒有任何問題。

#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運行正常。

但是當我試圖將這段代碼嵌入到另一個項目中時,它失敗了。 這真的讓我很困惑。

Makefile 就像下面這樣。

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 包含的文件中,
來自 Main.cpp:15:
/usr/include/python2.7/pyconfig.h:1158:0: 警告:“_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: 在 function main':
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
main':
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
main':
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
'

/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:82: 未定義對PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:83: undefined reference to
PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:83: undefined reference to
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: 未定義對PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
'

collect2: ld 返回 1 退出狀態
make: * [eu] 錯誤 1

有幫助嗎? 謝謝你!

看看盧卡斯的評論以獲得答案:

“要消除 _POSIX_C_SOURCE 警告,請確保在所有其他 header 文件之前包含 Python.h。”

我有同樣的問題。 我使用 Boost Python,所以我將 boost/python.hpp 的包含移動到 my.cpp 文件的第一行。

(Lukas,將您的評論作為答案發表,以便提出問題的人可以將其標記為正確答案,並且該問題不會在 StackOverflow 中保持“未回答”狀態。)

這是 Python 中的錯誤: https://bugs.python.org/issue1045893

如果您先包含 Python.h,編譯器不會報錯,但 GNU libc 的 /usr/include/features.h 會在定義 _GNU_SOURCE 時覆蓋它:

#undef _POSIX_C_SOURCE #定義_POSIX_C_SOURCE 200809L #undef _XOPEN_SOURCE #定義_XOPEN_SOURCE 700

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM