首页 > 解决方案 > 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 的符号链接来强制它。这也没有达到预期的效果。

标签: c++linuxgccld

解决方案


推荐阅读