如何在 Raspberry Pi 交叉编译器上 link 库?
How to link libraries on Raspberry Pi cross compiler?
我按照 this guide 为 Raspberry Pi ARMv7 构建了一个交叉编译器。它工作正常(编译 ok hello world)但问题是我不能使用 Raspberry Pi 库,如 wiringpi、sqlite 等
这是我的 Makefile。
CC = /opt/cross-pi-gcc/bin/arm-linux-gnueabihf-g++
QUOTE := "
CFLAGS = -g -lwiringPi -pthread -lpthread
PROGRAM = lora
OBJDIR = obj
CPP_SRCS += \
src/main.cpp \
src/radio/sx1276/sx1276.cpp \
src/radio/radio.cpp \
OBJ_FILES += \
$(OBJDIR)/main.o \
$(OBJDIR)/sx1276.o \
$(OBJDIR)/radio.o \
all: make_dir $(OBJ_FILES)
$(CC) $(OBJ_FILES) $(CFLAGS) -o $(PROGRAM)
make_dir:
mkdir -p $(OBJDIR)
$(OBJDIR)/main.o: src/main.cpp
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJDIR)/service.o: src/service/service.cpp
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJDIR)/sx1276.o: src/radio/sx1276/sx1276.cpp
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJDIR)/radio.o: src/radio/radio.cpp
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm $(PROGRAM)
rm -rf $(OBJDIR)
我遇到的错误:
/opt/cross-pi-gcc/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
我使用此命令将一些库从我的 Pi 复制到我的主目录中的一个文件夹中。
rsync -vR --progress -rl --delete-after --safe-links pi@192.168.1.PI:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs
我找到了 here。
但我不确定如何 link 它们。我是不是忽略了什么?
注意:我尝试编译的这段代码在 Windows 的交叉编译器上编译得很好。
我正在尝试在我的 Linux 桌面上设置一个工具链。我正在使用 Manjaro。
您必须告诉链接器在哪里寻找库。
您可以添加标志 -L$HOME/raspberrypi/rootfs/usr/lib
,或 libwiringPi.so
所在的位置。
您还必须将编译器指向右侧 headers。为此,您使用 -I
标志。例如。 -I$HOME/raspberrypi/rootfs/usr/include
。这进入了包含 wiringPi.h
.
的目标的 CFLAGS
此外,-lwiringPi -pthread -lpthread
不属于 CFLAGS
,它们是链接器标志。您只需要在构建 PROGRAM
的目标中使用它们。例如,您可以添加一个单独的变量 LDFLAGS
。
我按照 this guide 为 Raspberry Pi ARMv7 构建了一个交叉编译器。它工作正常(编译 ok hello world)但问题是我不能使用 Raspberry Pi 库,如 wiringpi、sqlite 等
这是我的 Makefile。
CC = /opt/cross-pi-gcc/bin/arm-linux-gnueabihf-g++
QUOTE := "
CFLAGS = -g -lwiringPi -pthread -lpthread
PROGRAM = lora
OBJDIR = obj
CPP_SRCS += \
src/main.cpp \
src/radio/sx1276/sx1276.cpp \
src/radio/radio.cpp \
OBJ_FILES += \
$(OBJDIR)/main.o \
$(OBJDIR)/sx1276.o \
$(OBJDIR)/radio.o \
all: make_dir $(OBJ_FILES)
$(CC) $(OBJ_FILES) $(CFLAGS) -o $(PROGRAM)
make_dir:
mkdir -p $(OBJDIR)
$(OBJDIR)/main.o: src/main.cpp
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJDIR)/service.o: src/service/service.cpp
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJDIR)/sx1276.o: src/radio/sx1276/sx1276.cpp
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJDIR)/radio.o: src/radio/radio.cpp
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm $(PROGRAM)
rm -rf $(OBJDIR)
我遇到的错误:
/opt/cross-pi-gcc/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
我使用此命令将一些库从我的 Pi 复制到我的主目录中的一个文件夹中。
rsync -vR --progress -rl --delete-after --safe-links pi@192.168.1.PI:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs
我找到了 here。
但我不确定如何 link 它们。我是不是忽略了什么?
注意:我尝试编译的这段代码在 Windows 的交叉编译器上编译得很好。 我正在尝试在我的 Linux 桌面上设置一个工具链。我正在使用 Manjaro。
您必须告诉链接器在哪里寻找库。
您可以添加标志 -L$HOME/raspberrypi/rootfs/usr/lib
,或 libwiringPi.so
所在的位置。
您还必须将编译器指向右侧 headers。为此,您使用 -I
标志。例如。 -I$HOME/raspberrypi/rootfs/usr/include
。这进入了包含 wiringPi.h
.
CFLAGS
此外,-lwiringPi -pthread -lpthread
不属于 CFLAGS
,它们是链接器标志。您只需要在构建 PROGRAM
的目标中使用它们。例如,您可以添加一个单独的变量 LDFLAGS
。