首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有二级依赖项链接的aarch64动态链接器rpath使用

问带有二级依赖项链接的aarch64动态链接器rpath使用
EN

Stack Overflow用户
提问于 2019-11-06 11:55:10
回答 1查看 767关注 0票数 2

我有两个共享库: liba和libb,其中libb依赖liba和一个使用libb的可执行文件。我在使用CMake for aarch64体系结构构建项目时遇到了一个问题,而宿主工具链的一切都很好。该项目如下:

代码语言:javascript
复制
├── CMakeLists.txt
├── liba
│   └── main.cpp
├── libb
│   └── main.cpp
└── main
    └── main.cpp

CMakeLists.txt内容如下:

代码语言:javascript
复制
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编译器构建项目时,我会得到链接器错误:

代码语言:javascript
复制
$ 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链接器的情况下,PRIVATE库无法工作。我试图寻找可能的链接器选项,但没有发现任何有用的东西。

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

代码语言:javascript
复制
$ 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-16 11:56:08

链接与交叉编译失败,因为sysroot是隐式指定的,因此当ld试图使用rpath查找依赖项时,它也会将其与sysroot放在前面。这个问题是在e0f735f8f53543773f01a4f692609d1b23fd3621中修复的,修复是从CMake 3.16.0开始的。因此,现在CMake还为私有依赖项添加了-rpath-link。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58729597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档