Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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++_C_Cmake_Arm_Cross Compiling - Fatal编程技术网

C++ 在交叉编译中尝试链接库时出现编译错误

C++ 在交叉编译中尝试链接库时出现编译错误,c++,c,cmake,arm,cross-compiling,C++,C,Cmake,Arm,Cross Compiling,已解决--在文章末尾进行解释 我正在做一个项目,现在我必须为ARM交叉编译两个包,一个库和一个依赖于该库的应用程序 我有一个用于库和应用程序的.cmake文件,它似乎可以正常工作,只是当编译过程到达链接阶段时,编译器会说它找不到一些库,然后关闭 我已经检查过,我的系统满足从源代码构建这些程序的所有要求,但是,关于项目的配置,有一些事情需要了解 由于我在交叉编译,我需要的所有库都必须是它们的ARM版本,这一点都不是问题,但我认为这些库的提供方式是造成所有问题的原因。我只是在猜测,因为我想不出还有什

已解决--在文章末尾进行解释

我正在做一个项目,现在我必须为ARM交叉编译两个包,一个库和一个依赖于该库的应用程序

我有一个用于库和应用程序的.cmake文件,它似乎可以正常工作,只是当编译过程到达链接阶段时,编译器会说它找不到一些库,然后关闭

我已经检查过,我的系统满足从源代码构建这些程序的所有要求,但是,关于项目的配置,有一些事情需要了解

由于我在交叉编译,我需要的所有库都必须是它们的ARM版本,这一点都不是问题,但我认为这些库的提供方式是造成所有问题的原因。我只是在猜测,因为我想不出还有什么其他原因会发生

因此,我使用.cmake文件提供这些库,该文件如下所示:

set(TC_路径)/usr/bin/)
设置(ROOTFS\u路径“/home/pc/Desktop/projects/ROOTFS”)
设置(交叉本地前缀“/usr”)
设置(CMAKE\u系统\u名称Linux)
设置(CMAKE_系统_处理器臂)
设置(交叉编译arm linux gnueabihf-)
集合(CMAKE_C_编译器“${TC_PATH}${CROSS_COMPILE}gcc”)
集合(CMAKE_CXX_编译器“${TC_PATH}${CROSS_COMPILE}g++”)
集合(CMAKE_链接器“${TC_PATH}${CROSS_COMPILE}ld”)
集合(CMAKE_AR“${TC_PATH}${CROSS_COMPILE}AR”)
集合(CMAKE_OBJCOPY“${TC_PATH}${CROSS_COMPILE}OBJCOPY”)
设置(CMAKE\u FIND\u ROOT\u PATH\u MODE\u PROGRAM NEVER)
设置(仅限CMAKE\U FIND\U ROOT\U PATH\U MODE\U库)
设置(仅限CMAKE\U FIND\U ROOT\U PATH\U MODE\U INCLUDE)
设置(仅限CMAKE\U FIND\U ROOT\U PATH\U MODE\U软件包)
集合(CMAKE_前缀_路径${ROOTFS_路径})
设置(CMAKE_安装_前缀“${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}”)
集合(CMAKE\u FIND\u ROOT\u PATH${ROOTFS\u PATH})
set(ENV{PKG_CONFIG_PATH}“${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}/lib/pkgconfig/”)
set(ENV{PKG\u CONFIG\u SYSROOT\u DIR}${ROOTFS\u PATH})
集合(CAER_LOCAL_PREFIX${CROSS_LOCAL_PREFIX})
集合(CAER_LOCAL_INCDIRS“${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}/include/”)
set(CAER_LOCAL_LIBDIRS“${ROOTFS_PATH}/lib/;${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}/lib/”)
因此,正如文件所指定的,保存库的目录分别是“${ROOTFS_PATH}/lib/”和“${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}/lib/”,最终翻译为“/home/pc/Desktop/projects/ROOTFS/lib/”和“/home/pc/Desktop/projects/ROOTFS/usr/lib”

这条路径有点非正统,但这正是ARM库所处的位置。原因是“rootfs”目录包含一个小型Linux发行版的文件系统,该发行版将在嵌入式硬件上运行,使用SD卡进行存储,它已经具备了所需的一切,除了这两个我很难编译的程序

因为库的目录是正确的,所以我希望编译能够顺利进行,但事实并非如此。相反,我得到了不止一个与库相关的错误:

汇编结果:

[7%]链接C共享库libcaer.so
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../../../../../arm-linux-gnueabihf/bin/ld:找不到/lib/libc.so.6
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../../../../../arm-linux-gnueabihf/bin/ld:找不到/usr/lib/libc_-nonshared.a
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../../../../../arm-linux-gnueabihf/bin/ld:找不到/lib/ld-linux-armhf.so.3
collect2:错误:ld返回了1个退出状态
src/CMakeFiles/caer.dir/build.make:248:目标'src/libcaer.so.3.1.0'的配方失败
make[2]:***[src/libcaer.so.3.1.0]错误1
CMakeFiles/Makefile2:135:目标“src/CMakeFiles/caer.dir/all”的配方失败
生成[1]:***[src/CMakeFiles/caer.dir/all]错误2
Makefile:151:目标“全部”的配方失败
make:**[全部]错误2
然而,这正是让我抓狂的地方,当出现错误时,他们说/lib/libc.so.6或其他任何库丢失了,而不是/home/pc/Desktop/projects/rootfs/usr/lib/任何库丢失了

从这一点上,我猜库没有在正确的目录中被查找,即使在.cmake文件中指定了正确的目录

我以前已经成功地构建了这两个程序,但唯一一次我成功地构建了这两个程序时,我不得不将未找到的特定库复制到编译器告诉我它正在查找它们的特定路径中

这意味着我将“/home/pc/Desktop/projects/rootfs/usr/lib/libc_nonshared.a”复制到“/usr/lib/libc_nonshared.a”中,依此类推

这种方法是不可接受的,因为我可能不得不给其他人一些指令,让他们自己编译应用程序,而复制已经存在于其他地方的库,仅仅因为编译器“忽略”它们是不正确的

所以,这是我所能做到的,我希望有人能对这件事有所了解。事先非常感谢

更新--已解决

因此,最后我浏览了cmake工具链文件文档页(),碰巧发现了一个名为“cmake_SYSROOT”的变量,该变量是可选的,如果主机系统中存在系统根以外的系统根,则可以使用它,如本例所示。因此,我尝试如下设置变量:

set(CMAKE\u SYSROOT“${ROOTFS\u PATH}”)

它奇迹般地奏效了;它停止在我的根系统(/lib/…,/usr/lib/…)中查找库,因此我猜文件系统中提供了最终使用的库和成功结束编译的库,对于库和相关应用程序。

请将编译输出复制并粘贴到问题中,作为文本,而不是显示屏幕截图。我建议在运行构建步骤之前设置并导出LANG=C,以获取英语错误