2012-04-07 21 views
6

g ++でテストコードをコンパイルしても問題ありません。罰金と実行作品 g ++ with python.h、コンパイル方法

#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

しかし、このコードを別のプロジェクトに埋め込もうとすると失敗します。それは本当に私を混乱させる。

メークファイルは次のとおりです。

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 [email protected] EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o Main.o 

clean: 
    rm -f $(TARGET) *.o 

このプロジェクトは、私が作った唯一の変更はMAIN.CPPファイルにテストコードを追加して、罰金コンパイルして実行されます。警告/エラーメッセージが示しています。15:
は/ usr /含む/ python2ファイルで

は/usr/include/python2.7/Python.h:8:0、
MAIN.CPPから からインクルード.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:注:これは、前の定義
グラム++ -Lは/ usr/libに/ -lpython2.7 -ldl -lutil -o EU EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o Main.o
Main.o:機能main':
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
でPy_Initialize」
/ホーム/ 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:84:未定義参照PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
Py_Exit 「
collect2は:ldは
メイク1つの終了ステータスが返されました:*[EU]エラー1

助けてください?ありがとうございました!

+2

多分libにPythonは「普通です"Cライブラリ。だから、C"リンケージ "を保証するために'外部 "C" {..} "を使用しなければならない可能性が高いです(確かに、.hはそれがCまたはC++コンパイラで動いているかどうかをチェックします。 ) – ShinTakezou

+0

Try nm libpython2.7.so | grep Py_Initializeを実行し、このシンボルがライブラリにあるかどうかを確認します。 – selalerer

+0

'main.cpp'にいくつかの行を追加し、いくつかのエラーがありました。古いバージョンに戻って、動作していることを確認してから、 '#include" Python.h "行だけを追加して何が起こるかを見てみてください。私はあなたが "未定義"エラーではなく、 "再定義された"エラーを得るだろうと思います。つまり、ヘッダガードをどこかに置くことを忘れていた可能性があります。これがうまくいけば、(Python.oのような)オブジェクトファイルをリンクしていないことに起因する "未定義"エラーに対処できます。 – Beta

答えて

12

は答えのためのルーカスさんのコメントを見てみましょう:

「_POSIX_C_SOURCEの警告を取り除くために、他のすべてのヘッダファイルの前にはPython.hが含まれていることを確認します。」

私は同じ問題を抱えていました。 Boost Pythonを使用していますので、私のためにboost/python.hppのインクルードファイルを.cppファイルの最初の行に移動しました。

(尋ねた人は正しい答えとしてそれをマークすることができるようにルーカスは、答えとしてあなたのコメントを投稿し、質問がStackOverflowの中に「未回答」は残りません。)

+0

あなたの提案は私のトリックでした。 – elgnoh

関連する問題