如何使用gcc编译和链接python3包装函数

时间:2014-11-05 03:11:16

标签: python c gcc makefile

我正在尝试使用gcc和makefile将一些C包装函数编译到Python 3.4,但是我没有成功找到正确的编译和链接标志。我正在使用Ubuntu 14

现在这就是我在makefile中尝试的内容:

CC      = gcc
CFLAGS  = -Wall -std=c99 `pkg-config --cflags python3` 
LDFLAGS = `pkg-config --libs python3` 

final: functions.o wrapper.o
$(CC) -o functions.o $(CFLAGS) $(LDFLAGS)

functions.o: functions.c functions.h
$(CC) $(CFLAGS) -c functions.c

wrapper.o: wrapper.c
$(CC) $(CFLAGS) -g -c wrapper.c

使用这个让我得到这个错误:

/usr/bin/ld: /usr/local/lib/libpython3.4m.a(dynload_shlib.o): undefined reference to symbol 'dlsym@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line

另外,我对makefile没什么经验,所以如果我在路上做错了,我就不会这样做

1 个答案:

答案 0 :(得分:1)

你应该找到一个关于Makefile的好教程,但是这个教程应该让你开始:

CC      = gcc
CFLAGS  = -Wall -std=c99 `pkg-config --cflags python-3.4`
CFLAGS  += -fPIC
LDFLAGS = `pkg-config --libs python-3.4`

all: myfunctions.so

myfunctions.so: wrapper.o functions.o
    $(CC) -shared $(LDFLAGS) $^ -o $@

如果要为Python创建C包装器,则需要创建共享对象。要做到这一点,您必须在编译时使用-fPIC并在链接时使用-shared。上面的示例Makefile使用内置规则将.c文件编译为.o个文件。此示例中的共享对象将创建为myfunctions.so,但您可以将myfunctions.so:更改为您想要调用的任何内容。可以使用make all调用此Makefile以生成共享对象。