【问题标题】:How to link libraries on Raspberry Pi cross compiler?如何在 Raspberry Pi 交叉编译器上链接库?
【发布时间】:2020-04-17 17:01:26
【问题描述】:

我跟随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

但我不确定如何链接它们。我是不是忽略了什么?

注意:我试图编译的那段代码在 Windows 的交叉编译器上编译得很好。 我正在尝试在我的 Linux 桌面上设置一个工具链。我正在使用 Manjaro。

【问题讨论】:

  • 您可以将单个文件的所有编译规则替换为单个模式规则以及您的 CPP_SRCS 变量。通常你会保留目录结构,例如src/service/service.cpp -> obj/service/service.o 这将帮助您从 CPP_SRCS 自动生成 OBJ_FILES 并具有通用规则。

标签: linux raspberry-pi cross-compiling


【解决方案1】:

您必须告诉链接器在哪里查找库。
您可以添加标志-L$HOME/raspberrypi/rootfs/usr/lib,或libwiringPi.so 所在的任何位置。

您还必须将编译器指向正确的标头。为此,您使用 -I 标志。例如。 -I$HOME/raspberrypi/rootfs/usr/include。这在包含wiringPi.h 的目标的CFLAGS 中。

另外,-lwiringPi -pthread -lpthread 不属于CFLAGS,它们是链接器标志。您只需要在构建PROGRAM 的目标中使用它们。例如,您可以添加一个单独的变量 LDFLAGS

【讨论】:

  • 我在 CFLAGS 末尾添加了 -L/home/name/raspberrypi/rootfs 的完整路径。我仍然得到同样的错误
  • @MrBit 不要替换它,添加 -L 标志。保留其他标志。
  • @MrBit:你是在调整链接规则还是编译规则?链接器不需要头文件,编译器不需要库!
  • @tttapa:由于他之前完成了编译步骤并且在链接步骤中失败了,我认为他不需要再弄乱包含路径了。
  • 是的,我必须添加 -I 标志。另外,从你说的我的 Makefile 有点乱。我会看看我能不能做得更好。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
相关资源
最近更新 更多