Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交叉编译c++;对于树莓pi标准错误_C++_Raspberry Pi_Cross Compiling_Libstdc++ - Fatal编程技术网

C++ 交叉编译c++;对于树莓pi标准错误

C++ 交叉编译c++;对于树莓pi标准错误,c++,raspberry-pi,cross-compiling,libstdc++,C++,Raspberry Pi,Cross Compiling,Libstdc++,我需要为Raspberry Pi(armV6)交叉编译C/C++代码。我按照上的说明操作,在我的主机(Ubuntu 14.04)上运行了大楼 所以我的项目建立在我的主机上,在对所需的库感到不安之后,我很高兴。但是当我将程序转移到我的Raspberry Pi时,我得到了以下错误: {ProjectName}: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by {P

我需要为Raspberry Pi(armV6)交叉编译C/C++代码。我按照上的说明操作,在我的主机(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++交叉编译器

我尝试使用的程序是由其他人直接在pi上编写的,它在那里构建、编译和运行都非常完美

我的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
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=$(通配符src/*cpp)
OBJECTS=$(addprefix obj/,$(notdir$(SOURCES:.cpp=.o)))
可执行文件=bin/wackytalky
全部:$(来源)链接执行
调试:CFLAGS+=-g
调试:$(源代码)链接\u EXEC
LINK_EXEC:$(对象)
$(CC)$(LDFLAGS)-o$(可执行文件)$^$(LIBB)$(IFLAGS)
obj/%.o:src/%.cpp
$(CC)$(CFLAGS)-o$@-c$<$(IFLAGS)
清洁:
rm$(可执行文件)obj/*.o

您必须将libstdc++和其他文件复制到您的临时pi中。如果使用较新的编译器生成需要较新库的可执行文件,则目标上必须存在此库。静态链接不是一个有用的选项。只需将新的LIB复制到目标上的适当路径

因此,我怀疑交叉编译器使用的是libstd++,而不是作为交叉编译器一部分的主机,但我不知道如何修复它

不,我不相信。如果编译器配置正确,它将使用正确的libs。如果它试图使用x86 libs,您不会收到错误版本的消息,因为动态链接器根本无法使用x86 libs

对于下层选民:——): 您可以在目标上有多个版本,因此这样做没有问题,有关详细信息,请参阅ldconfig。此外,您可以在本地或任何其他路径中使用lib,而不会出现问题,为此,您可以使用LD_LIBRARY_path。是的,我没有写过你应该删除旧版本。Linux不是windows,因此添加的库不会破坏系统。Linux没有像dll那样的问题

根据您的特殊要求,我使用两个不同的编译器构建了一个程序,并从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)
通用条款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)
正如您所看到的:一个库一个系统的两个版本完全没有问题

有关操作系统上不同LIB的更多信息,请参见:

如果它在您的系统上无法工作,请随时再次询问

我昨天遇到了和你一样的问题。我还没有时间继续Pi方面的工作,所以我只是修改了交叉编译选项(我使用eclipse),并在linker命令中添加了
-static libstdc++
。这是Ubuntu端代码中的静态链接,因此Pi端的.so问题永远不会出现


显然,它会产生更大的可执行文件。

不,您不必将任何libs复制到raspberry。工具链必须与设备上的LIB匹配。某些工具链(即用于Rasbperry的Windows交叉工具链)允许通过将LIB从设备复制到生成计算机来更新其LIB,但决不能反过来。如果确实将LIB从交叉编译环境复制到目标环境,则您会发现目标上的现有程序可能会停止工作!我不完全理解,如果交叉编译器sysroot与目标机器具有相同的库,为什么我需要在目标机器上放置新库?交叉编译器的全部目的不是为了避免无休止的库传输吗?sysroot提供的不是glibcxx!这个库来自libstdc++,它是gcc发行版的一部分。如果您构建的新编译器支持库的更新版本,则该库必须存在于您的目标上。这个库根本不在您的目标系统上。这并不意味着要替换libc或来自内核和内核c接口的东西。正如您在我的ldd输出中所看到的,这些LIB位于/opt/。。。这来自我的个人配置。操作系统中的lib被放置在/lib或/usr/lib(可能还有其他…)中,所以只需将libstdc++.So.6.19从主机复制到目标机器就可以解决问题了?我不需要做一些象征性的引用?不是很明显:如果你用这种方式构建一个非常特殊的应用程序,静态构建的exec不必比动态链接的exec加上它的专用libs的总和大那么多。如果这能为您省去获得正确的libs的麻烦,那么对于更大的容量来说,额外的存储成本(如果有的话)可能是值得的