使用 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/
也没有什么意义。
我想从我的 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/
也没有什么意义。