我需要交叉编译Raspberry Pi(armV6)的C / C ++代码。我按照http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/上的说明进行操作,然后我的主机(Ubuntu 14.04)上的建筑工作了。
所以我的项目建立在我的主机之后,对所需的库有些恼火,我很开心。但是当我将程序转移到我的Raspberry Pi时,我收到了以下错误:
{ProjectName}: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by {ProjectName})
{ProjectName}: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by {ProjectName})
所以我怀疑交叉编译器正在使用libstd ++。所以我的主机而不是交叉编译器的一部分,但我不知道如何解决它。
我正在使用gcc-linaro-arm-linux-gnueabihf-raspbian / arm-linux-gnueabihf-g ++交叉编译器。
我尝试开始工作的程序是由其他人直接编写的,在那里构建,编译和运行完美。
我的makefile如下所示:
CC=arm-linux-gnueabihf-g++
IFLAGS=-pthread -I./headers -lwiringPi -lortp -llinphone
LIBB = -I/home/david/rpi/rootfs/usr/lib/arm-linux-gnueabihf/
CFLAGS=-Wall -std=c++0x
LDFLAGS=-Wall
SOURCES=$(wildcard src/*cpp)
OBJECTS=$(addprefix obj/,$(notdir $(SOURCES:.cpp=.o)))
EXECUTABLE=bin/wackytalky
all: $(SOURCES) LINK_EXEC
debug: CFLAGS += -g
debug: $(SOURCES) LINK_EXEC
LINK_EXEC: $(OBJECTS)
$(CC) $(LDFLAGS) -o $(EXECUTABLE) $^ $(LIBB) $(IFLAGS)
obj/%.o: src/%.cpp
$(CC) $(CFLAGS) -o $@ -c $< $(IFLAGS)
clean:
rm $(EXECUTABLE) obj/*.o
答案 0 :(得分:2)
我和你昨天有同样的问题(确切地说)。我还没有时间跟进Pi端,所以我修改了我的交叉编译选项(我使用eclipse)并将-static-libstdc++
添加到链接器命令。这静态链接在Ubuntu端的代码中,因此Pi端的.so问题永远不会出现。
显然它会产生更大的可执行文件。
答案 1 :(得分:-1)
你必须将libstdc ++和其他人复制到你的respary pi。如果您使用较新的编译器生成需要较新lib的可执行文件,则此lib必须存在于目标上。静态链接不是一个有用的选项。只需将新库复制到目标上的相应路径即可。
所以我怀疑交叉编译器正在使用libstd ++。所以我的主机而不是交叉编译器的一部分,但我不知道如何解决它。
不,我不相信这一点。如果您的编译器配置正确,它将使用正确的库。如果它试图使用x86库,则不会收到错误版本的消息,因为动态链接器根本无法使用x86库。
对于downvoters :-): 您可以在目标上拥有多个版本,因此执行此操作没有问题,有关详细信息,请参阅ldconfig。您也可以在本地或任何其他路径中使用lib而不会出现问题,为此您可以使用LD_LIBRARY_PATH。是的,我没有写过你应该删除旧版本。 Linux不是Windows,因此添加的库不会破坏系统。 Linux没有问题,比如赢得胜利......
根据您的特殊要求,我使用两个不同的编译器构建一个程序,并从ldd:
获取gcc 4.9:
linux-vdso.so.1 => (0x00007fff4b7fe000)
librt.so.1 => /lib64/librt.so.1 (0x00000030f2200000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000030f1200000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030f0e00000)
libstdc++.so.6 => /opt/linux-gnu_4.9-20140105/lib64/libstdc++.so.6 (0x00007fa4aadc4000)
libm.so.6 => /lib64/libm.so.6 (0x00000030f1600000)
libgcc_s.so.1 => /opt/linux-gnu_4.9-20140105/lib64/libgcc_s.so.1 (0x00007fa4aabad000)
libc.so.6 => /lib64/libc.so.6 (0x00000030f0a00000)
gcc 4.8.2:
linux-vdso.so.1 => (0x00007fff4b7fe000)
librt.so.1 => /lib64/librt.so.1 (0x00000030f2200000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000030f1200000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030f0e00000)
libstdc++.so.6 => /opt/linux-gnu_4.8.2/lib64/libstdc++.so.6 (0x00007fa4aadc4000)
libm.so.6 => /lib64/libm.so.6 (0x00000030f1600000)
libgcc_s.so.1 => /opt/linux-gnu_4.8.2/lib64/libgcc_s.so.1 (0x00007fa4aabad000)
libc.so.6 => /lib64/libc.so.6 (0x00000030f0a00000)
如您所见:一个库的两个版本一个系统,完全没有问题。
os上不同lib上的更多信息请看:
How do applications resolve to different versions of shared libraries at run time?
如果它无法在您的系统上运行,请随时再次询问。