c++ - ld 找不到 -latomic 或 -lstdc++
问题描述
当尝试使用我正在开发的硬件制造商提供的工具链编译我的项目时,编译成功,但是链接失败并显示以下错误消息:
/media/xxx/Data/toolchains/sysroots/x86_64-xxx-linux/usr/bin/arm-xxx-linux-gnueabi/../../libexec/arm-xxx-linux-gnueabi/gcc/arm-xxx -linux-gnueabi/4.8.4/ld:找不到-latomic
/media/xxx/Data/toolchains/sysroots/x86_64-xxx-linux/usr/bin/arm-xxx-linux-gnueabi/../../libexec/arm-xxx-linux-gnueabi/gcc/arm-xxx -linux-gnueabi/4.8.4/ld:找不到-lstdc++
但是,当使用相同的编译器和链接器构建小型测试程序时,一切正常。
下面是我的 CMake 工具链文件的重要部分的摘录:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
###
# Get $CROSS
###
if (NOT $ENV{CROSS_COMPILE} STREQUAL "")
set(cross $ENV{CROSS_COMPILE}) # WARNING: Ends with a - (minus)
else()
set(cross "arm-xxx-linux-gnueabi-")
endif()
###
# Set CMake sysroot
###
set(CMAKE_SYSROOT $ENV{SDKTARGETSYSROOT})
set(CMAKE_SYSROOT_LINK $ENV{SDKTARGETSYSROOT})
set(CMAKE_SYSROOT_COMPILE $ENV{SDKTARGETSYSROOT})
set(CMAKE_C_COMPILER $ENV{TOOLCHAIN_TOOLSDIR}/${cross}gcc)
set(CMAKE_CXX_COMPILER $ENV{TOOLCHAIN_TOOLSDIR}/${cross}g++)
set(CMAKE_LD $ENV{TOOLCHAIN_TOOLSDIR}/${cross}ld)
set(CMAKE_STRIP $ENV{TOOLCHAIN_TOOLSDIR}/${cross}strip)
set(CMAKE_AR $ENV{TOOLCHAIN_TOOLSDIR}/${cross}ar)
include_directories($ENV{SDKTARGETSYSROOT}/usr/include)
我不能随意透露源代码,但源代码在这里不是问题,因为它可以正确编译。
这是 CMakeLists.txt 文件的另一个 MWE:
cmake_minimum_required(VERSION 3.10)
project(xxx LANGUAGES CXX VERSION 2.0.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(TARGET_NAME xxx.bin)
include_directories(
include/
${INCLUDE_DIRS}
)
file(GLOB_RECURSE FILES ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.cpp)
if (xxx_DEBUG)
add_compile_options(
-Wpedantic
-DDDC_STUB
-fabi-version=6
-Wno-format-security
-Wno-reorder
-ggdb3
-O0
-fpermissive # Test
-fPIC
#-static-libstdc++ # with or without, doesn't change the behaviour
#-static-libgcc # with or without, doesn't change the behaviour
)
else()
add_compile_options(
-Wpedantic
-fabi-version=6
-Wno-format-security
-Wno-reorder
-O3
-fpermissive # Test
-fPIC
#-static-libstdc++ # with or without, doesn't change the behaviour
#-static-libgcc # with or without, doesn't change the behaviour
)
endif()
add_executable(${TARGET_NAME} ${FILES} ${MEMWATCH_FILES})
我尝试为 ld 设置 sysroot-argument,我尝试手动指定链接(搜索)路径-L$ENV{SDKTARGETSYSROOT}/usr/lib/.debug
,并且我还尝试硬连接相关库的路径:$ENV{SDKTARGETSYSROOT}/usr/lib/.debug/libatomic.so.1.0.0
还有另一种方法可以告诉 ld 使用哪些库吗?这与标准工具链完美配合!
编辑:
我现在还尝试通过创建从 .debug/libatomic 到 usr/lib/libatomic 的符号链接来强制它。这也没有达到预期的效果。
解决方案
推荐阅读
- html - 如何从 HTML 元素中获取文本
- mysql - 无法打开 CloudSQL 二进制日志:“没有这样的文件或目录”
- latex - 更改特定条目的文本引用
- excel - 将文本转换为日期格式 MMM-YY 的列问题
- c# - 调用框架内的表单方法
- python - 如何更改 Jupyter Notebook 中的语法高亮显示?
- java - 底部导航视图中选定选项卡的颜色保持不变
- c# - 在 Devexpress 中获取网格列值
- entity-framework-core - 使用 Fluent API entity Framework Core 2 配置多对多
- javascript - 获取 HTML、CSS 和 Javascript 文件资源的新副本