c++ - aarch64 动态链接器 rpath 使用与辅助依赖链接

标签 c++ cmake arm ld binutils

我有两个共享库: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 使用 rpath要查找的 ELF 条目 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

最佳答案

链接失败,交叉编译为 sysroot是隐式指定的,所以当 ld尝试使用 rpath 查找依赖项, 它还在它前面加上 sysroot .该问题已在 e0f735f8f53543773f01a4f692609d1b23fd3621 中修复并且自 CMake 3.16.0 起包含该修复程序。所以现在 CMake 也添加了 -rpath-link对于私有(private)依赖。

关于c++ - aarch64 动态链接器 rpath 使用与辅助依赖链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729597/

相关文章:

gcc - 如何链接到外部 THUMB 代码?

c++ - const 和非 const 键有什么区别?

c++ - 在 C++ 中使用另一个项目中的类

c - 来自另一个目标的 add_custom_command

c++ - 程序集,全局变量

c - GNU ARM 嵌入式工具链安装问题

c++ - 使用 == 比较两个 LPCSTR

c++ - 斐波那契数列

Opencv 'undefined reference to ` cv::namedWindow....'(链接错误)

CMake find_package : where did it find the package?