

始めまして。最近Pythonを始めました。  
現在C言語で開発を進めており、一部の処理をPythonで行いたいと考えております。  
こちらの記事を参考にして、Pythonを埋め込んでみました。  
<http://d.hatena.ne.jp/mscp/20090919/1261917834>

結果から申し上げますと、Py_Initialize()以下独自の関数が存在しないと  
エラーが発生してしまい、コンパイルできない状態です。  
Makefileとエラー内容は以下です。

[code]

    gcc -I/usr/include/python2.6 -L/usr/lib/python2.6 test.c -o test
    
[/code]

エラー内容

[code]

     make: 警告: ファイル `Makefile' の修正時刻が 7.4e+02 秒分未来の時刻です gcc
     -I/usr/include/python2.6 -L/usr/lib/python2.6 test.c -o test In file included from /usr/include/python2.6/Python.h:8,
                      from test.c:7: /usr/include/python2.6/pyconfig.h:1031:1: warning: "_POSIX_C_SOURCE"
     redefined In file included from /usr/include/sys/types.h:27,
                      from test.c:1: /usr/include/features.h:210:1: warning: this is the location of the previous definition
     /tmp/ccZzd8yt.o: 関数 `main' 内: test.c:(.text+0x381):
     `Py_SetProgramName' に対する定義されていない参照です test.c:(.text+0x386):
     `Py_Initialize' に対する定義されていない参照です test.c:(.text+0x392):
     `PyImport_ImportModule' に対する定義されていない参照です test.c:(.text+0x3b8):
     `PyObject_CallMethod' に対する定義されていない参照です test.c:(.text+0x3de):
     `PyArg_Parse' に対する定義されていない参照です test.c:(.text+0x3ef): `Py_Finalize'
     に対する定義されていない参照です collect2: ld returned 1 exit status make: ***
     [test] エラー 1
    
[/code]

おそらくライブラリがうまく貼れていないのではないかと思うのですが、  
いまいちやり方がわかりません。  
どなたか助言よろしくおねがいします。

◆開発環境  
OS:Debian@SQUEEZE  
Version:Python2.6  
IDE:NetBeans

test.c

[code]

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <signal.h>
    #include <termios.h>
    #include <unistd.h>
    #include <Python.h>
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAIN_C
    #include "exitfail.h"
    
    #define SERIAL_BAUNDRATE 115200
    #define BUF_SIZE 256
    #define MAXITEM 20
    
    #define THRMO 7
    
    #define INDEX_HEADER1 0
    #define INDEX_HEADER2 1
    #define INDEX_DATASIZE1 2
    #define INDEX_DATASIZE2 3
    #define INDEX_DATA 4
    #define BIT_OFFSET 8
    
    #define HEX_HEADER1 0xA5
    #define HEX_HEADER2 0x5A
    #define HEX_MSB 0x8000
    #define HEX_EOT 0x04
    
    int main(int argc, char *argv[])
    {
    
        exitfail_init();
        PyObject *pModule, *pTmp;
        char *sTmp;
        Py_SetProgramName(argv[0]);
        Py_Initialize();
    
        pModule = PyImport_ImportModule("script");
    
    
        pTmp = PyObject_CallMethod(pModule, "func", NULL);
    
    
        PyArg_Parse(pTmp, "s", &sTmp);
    
        printf("%s\n", sTmp);
    
        Py_Finalize();
    
        return EXIT_SUCCESS;
    }
    
[/code]


CC BY-SA 3.0
2016-09-15T13:10:04.260
28907
2016-09-22T10:07:40.253
2016-09-21T09:54:55.183
3054
18802
question
python linux gcc
C言語からPythonを埋め込んだ場合に、Py_Initialize()が存在しないエラーが発生する。

[code]

    gcc -I/usr/include/python2.6 -L/usr/lib/python2.6 test.c -o test
    
[/code]

ライブラリのパスは指定していますが、肝心のライブラリを指定していません。

[code]

    gcc -I/usr/include/python2.6 -L/usr/lib/python2.6 test.c -o test -lpython2.6
    
[/code]

かな?(debianのライブラリ名がどうなっているか知らないので、もし違っていたら/usr/lib/python2.6の中を探してみてください)

ただ、python-configやpkg-
configというコマンドを使ったほうが、適切なコンパイルオプションを指定できますので、そちらを使うことをおすすめします。

[code]

    gcc test.c -o test $(python-config --cflags --ldflags)
    
[/code]

一応フォローしておくと、上記のコマンドはbash上で実行する場合です。  
Makefile内に記述する場合には、「$」マークはマクロと判断されてしまうので、

[code]

    gcc test.c -o test $$(python-config --cflags --ldflags)
    
[/code]

というように「$」を重ねるか、

[code]

    gcc test.c -o test $(shell python-config --cflags --ldflags)
    
[/code]

というように「shell」マクロを使ってください。

(NetBeansを使った事はないので、もしかしたらNetBeansなりのやり方があるかもしれませんので、あしからず)

* * *

### 以下、質問者向けでないひとりごと

(linuxmint18で試したら、python-configとpkg-configの出力が違うのだけど、いいんかな?)

[code]

    $ pkg-config --cflags --libs python
    -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -lpython2.7
    $ python-config --cflags --libs
    -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7  -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes
    -lpython2.7 -lpthread -ldl  -lutil -lm 
    
[/code]

* * *

長くなりそうなので、こちらでコメントします。

まず、ライブラリのファイル名についてです。

gccのライブラリのファイル名は、通常は「lib _ほげ_.a」になり、これをリンク時に使用する際には「-l _ほげ_ 」と指定します。  
ですので、今回探すのは「libpython2.6.a」(もしくは、「libpython*.a」)です。

とりあえず確認事項ですが。

  * debianは32bit版ですか？64bit版ですか？
  * pythonは、debianのパッケージの物を使っていますか?
  * 「dpkg-query -L libpython2.6-dev」を実行すると、パッケージのファイル名一覧が表示されます。その中の「libpython2.6.a」を探し、「/usr/lib/python2.6」にあるか確認してください。  
もしディレクトリが違っていたら、「-L/usr/lib/python2.6」を「-L<そのディレクトリ>」に変えて、ビルドしてください。

  * 上のひとりごとで書いたように「python-config --cflags --ldflags」を実行してみて、出力を確認してみてください。もし「python-config」が実行できなければ、「python-dev」をインストールしてください。(手元にsqueezeがないんで、パッケージ名が間違っているかもしれませんが)
  * それでも解決しないのであれば、「find /usr/lib -name 'libpython*.a'」を実行してみて、pythonのライブラリファイルを探してみてください。

# simoneさんの言うとおり、コンパイルは通るんだからライブラリもインストールされているはずなんだがなぁ…。

# (neurontさんからの指摘があり、python-configの「--libs」を「--ldflags」に変更しました。)


CC BY-SA 3.0
2016-09-15T14:12:46.553
28908
2016-09-22T10:07:40.253
2016-09-22T10:07:40.253
15473
15473
28907
answer