木槿巴巴

Linux下编译Python/C API问题

在Linux下编译python c api时遇到 类似下面的错误:

 undefined reference to `Py_Initialize

当然,如果你在windows平台下,使用IDE可能不会遇到这样问题。但是在linux,unix下呢,要自己动手写Makefile呢?
猜测这可能是缺少某些库,Google一下可以找到答案,这里文章会给出原因和解决方案,但是在多一下废话给刚刚接触python C API 的童鞋们,这不是所谓的技术文章,只是希望众多刚刚步入python大门遇到此类问题的一个参考。当然我也是菜鸟…

Linux下安装python,当前的发行版通常已经安装了python,但是可能版本等原因,如果需要安装,建议源码编译安装:

到这里下载所对应的版本:http://python.org/解压,cd到解压后的python(X.X.X).

# ./configure
#  make
#  make install

这样编译安装完成,在Terminal下敲python:

Python 2.7.3 (default, Jul  3 2012, 18:01:45) 
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

OK,现在来试试Python/C API.网上的例子很多,随便拿来一个最简单的,假设保存为main.c:

//This is A sample.
#include "Python.h"

int main()
{
        Py_Initialize();
        printf("This is a C-Python Program.\n");
        PyRun_SimpleString("print(\"Hello,Python\")");
        Py_Finalize();
        return 0;
}

 

写一个Makefile,因为python的安装目录都采取了默认:

ALL	= ./tc
CC	= gcc
RM	= rm
LIBS	=  -lpthread -lm -ldl -lutil 
INCL	= /usr/local/include/python2.7

OBJ	= main.o
all:$(ALL)

./tc : $(OBJ) 
	$(CC)  $(OBJ) -I$(INCL) -L$(LIBS) -L/usr/localb/ -lpython2.7 -o $@

clean:
	$(RM) $(OBJ) 
	$(RM) $(ALL)

好了,编译,运行:

This is a C-Python Program
Hello,Python

那么,文章开头提到的问题呢,没忘记呢。是因为在编译时忘记链接这些库:

-lpthread -lm -ldl -lutil
不要忘了,还有,注意Python.h的路径,P是大写!

 

 

Exit mobile version