使用 cython 库从 x86 交叉编译一个 c 程序到 arm

cross compilation of a c program from x86 to arm with cython library

我想从我的 PC 上为我的 raspberry pi 编译一个 C 程序。

我的程序使用了 rt、pthread 和 cython 库。

我为此使用 arm-linux-gnueabihf-gcc 编译器,并制作了一个 makefile:

CC = gcc

CC_ARM = arm-linux-gnueabihf-gcc

CFLAGS = -I -g -Wall

INCLUDES = -I/usr/include/python3.8 -I/

LIBS = -lrt -lpthread -lpython3.8

SRCS = main.c Config_radio.c

OBJS = $(SRCS:.c=.o)

MAIN = radio

ARM = radio_arm

.PHONY: depend clean

all:    $(MAIN)
        @echo  radio has been compiled

$(MAIN): $(OBJS)
        $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)

$(ARM): $(OBJS)
        $(CC_ARM) $(CFLAGS) $(INCLUDES) -o $(ARM) $(OBJS) $(LFLAGS) $(LIBS)

.c.o:
        $(CC) $(CFLAGS) $(INCLUDES) -c $<  -o $@

clean:
        $(RM) *.o *~ $(MAIN)

depend: $(SRCS)
        makedepend $(INCLUDES) $^

当我使用 gcc 编译时,编译成功但是当我尝试使用 arm-linux-gnueabihf-gcc 编译时,出现以下错误:

make radio_arm
gcc -I -g -Wall -I/usr/include/python3.8 -I/ -c main.c  -o main.o
gcc -I -g -Wall -I/usr/include/python3.8 -I/ -c Config_radio.c  -o Config_radio.o
arm-linux-gnueabihf-gcc -I -g -Wall -I/usr/include/python3.8 -I/ -o radio_arm main.o Config_radio.o  -lrt -lpthread -lpython3.8
main.o: file not recognized: file format not recognized
collect2: error: ld returned 1 exit status
make: *** [Makefile:28 : radio_arm] Erreur 1

我认为我的库不适用于 arm-linux-gnueabihf-gcc。

你能告诉我如何解决这个问题吗?

您使用 gcc 编译了 main.o。该 GCC 大概是您的 x86 系统的本机编译器。因此,main.o 中将包含 x86 代码,无法链接到 ARM 程序中。

确保所有你的objects和所有你正在链接的库是用ARM工具链编译的,然后事情应该没问题。

此外,-I/usr/include/python3.8 对我来说似乎是个问题,因为它们将是您系统上本机 Python 的 headers,而不是 Python cross-compiled 用于 ARM。它可能有效,但似乎风险很大。 -I 本身和 -I/ 也没有什么意义。