具有辅助依赖关系链接的aarch64动态链接器rpath用法

icblnk

我有两个共享库:liba和libb,其中libb取决于liba和使用libb的可执行文件。我遇到了使用CMake进行aarch64架构构建项目的问题,而一切在主机工具链上都可以正常工作。该项目如下所示:

├── CMakeLists.txt
├── liba
│   └── main.cpp
├── libb
│   └── main.cpp
└── main
    └── main.cpp

CMakeLists.txt的内容如下:

cmake_minimum_required(VERSION 3.15)
project(my_proj CXX)

add_library(a SHARED liba/main.cpp)
set_property(TARGET a PROPERTY LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/a")
add_library(b SHARED libb/main.cpp)
set_property(TARGET b PROPERTY LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/b")
target_link_libraries(b PRIVATE a)

add_executable(main main/main.cpp)
target_link_libraries(main b)

使用我的主机g ++ / ld编译器/链接器,一切都可以正常工作。但是,当我尝试使用ARM编译器构建项目时,出现链接器错误:

$ cmake .. -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++
-- The CXX compiler identification is GNU 9.2.0
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/icblnk/tmp/rm/test/build
$ make
Scanning dependencies of target a
[ 16%] Building CXX object CMakeFiles/a.dir/liba/main.cpp.o
[ 33%] Linking CXX shared library a/liba.so
[ 33%] Built target a
Scanning dependencies of target b
[ 50%] Building CXX object CMakeFiles/b.dir/libb/main.cpp.o
[ 66%] Linking CXX shared library b/libb.so
[ 66%] Built target b
Scanning dependencies of target main
[ 83%] Building CXX object CMakeFiles/main.dir/main/main.cpp.o
[100%] Linking CXX executable main
/usr/lib/gcc/aarch64-linux-gnu/9.2.0/../../../../aarch64-linux-gnu/bin/ld: warning: liba.so, needed by b/libb.so, not found (try using -rpath or -rpath-link)
/usr/lib/gcc/aarch64-linux-gnu/9.2.0/../../../../aarch64-linux-gnu/bin/ld: b/libb.so: undefined reference to `function_liba_1()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:85: main] Error 1
make[1]: *** [CMakeFiles/Makefile2:78: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

问题在于CMake使用rpathELF条目来查找PRIVATE库,由于某些原因,在ARM的链接程序中,该库不起作用。我试图研究可能的链接器选项,但是找不到任何有用的东西。

我在示例中使用的编译器/链接器版本:

$ ld --version
GNU ld (GNU Binutils) 2.32
$ aarch64-linux-gnu-ld --version
GNU ld (GNU Binutils) 2.32
$ g++ --version
g++ (GCC) 9.2.0
$ aarch64-linux-gnu-g++ --version
aarch64-linux-gnu-g++ (GCC) 9.2.0
icblnk

链接由于sysroot隐式指定的交叉编译而失败,因此当ld尝试使用查找依赖项时rpath,它还会加上sysroot此问题已在e0f735f8f53543773f01a4f692609d1b23fd3621中修复,自CMake 3.16.0起已包含此修复程序。因此,现在CMake还添加-rpath-link了私有依赖项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我有两个生成器,我希望将依赖关系链接到

来自分类Dev

如何在SetupTools中配置SVN依赖关系链接

来自分类Dev

将依赖关系链接到静态库?

来自分类Dev

将依赖关系链接到静态库?

来自分类Dev

链接具有相互依赖关系的静态fortran库

来自分类Dev

用变态关系链接值

来自分类Dev

用变态关系链接值

来自分类Dev

显示@RestResource(exported = false) 的关系链接

来自分类Dev

如何防止多个依赖关系链接到同一本机库?

来自分类Dev

如何通过多对多关系链接两个现有记录

来自分类Dev

Rails-如何以多对多关系链接两个现有记录?

来自分类Dev

如何通过多对多关系链接两个现有记录

来自分类Dev

基于多个关系链接的Gridview过滤器

来自分类Dev

确定通过多对多关系链接的“可达”对象

来自分类Dev

具有动态依赖关系的静态库

来自分类Dev

将具有循环链接依赖关系的makefile转换为CMake

来自分类Dev

Vim动态链接依赖关系未通过ldd列出

来自分类Dev

辅助功能:仅使用具有href =“#”的javascript链接

来自分类Dev

动态链接库是否存在rpath?

来自分类Dev

具有动态链接的GCC插件的Valgrind

来自分类Dev

用于AARCH64的GHC Haskell编译器

来自分类Dev

具有链接列表的C ++迭代器

来自分类Dev

具有依赖关系的动态表单下拉菜单

来自分类Dev

用两个(复合)外键关系链接两个表

来自分类Dev

如何使用 InlinePanel 以多对多关系链接 wagtail 中的两个页面模型

来自分类Dev

Unity - 具有覆盖参数的链接依赖项

来自分类Dev

Oracle PLSQL依赖关系链(无效对象)

来自分类Dev

在Ada中动态链接库会引入额外的依赖关系

来自分类Dev

Gradle中的依赖关系不链接罐子

Related 相关文章

热门标签

归档