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':
でPy_Initialize」
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
/ホーム/ BBC/TWS/IBJts/cpp/eu-ats/Main.cpp:82:未定義参照PyRun_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:未定義参照PyRun_SimpleStringFlags'
Py_Exit 「
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
collect2は:ldは
メイク1つの終了ステータスが返されました:*[EU]エラー1
助けてください?ありがとうございました!
多分libにPythonは「普通です"Cライブラリ。だから、C"リンケージ "を保証するために'外部 "C" {..} "を使用しなければならない可能性が高いです(確かに、.hはそれがCまたはC++コンパイラで動いているかどうかをチェックします。 ) – ShinTakezou
Try nm libpython2.7.so | grep Py_Initializeを実行し、このシンボルがライブラリにあるかどうかを確認します。 – selalerer
'main.cpp'にいくつかの行を追加し、いくつかのエラーがありました。古いバージョンに戻って、動作していることを確認してから、 '#include" Python.h "行だけを追加して何が起こるかを見てみてください。私はあなたが "未定義"エラーではなく、 "再定義された"エラーを得るだろうと思います。つまり、ヘッダガードをどこかに置くことを忘れていた可能性があります。これがうまくいけば、(Python.oのような)オブジェクトファイルをリンクしていないことに起因する "未定義"エラーに対処できます。 – Beta