在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是大写!