当尝试使用要开发的硬件制造商提供的工具链来编译我的项目时,编译成功,但是链接失败并显示以下错误消息:
/ 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参数,我尝试手动指定链接(搜索)路径-L$ENV{SDKTARGETSYSROOT}/usr/lib/.debug
,并且还尝试了硬性连接到相关库的路径: $ENV{SDKTARGETSYSROOT}/usr/lib/.debug/libatomic.so.1.0.0
还有另一种方法可以告诉ld使用哪些库? 这与标准工具链完美配合!
编辑:
我现在还尝试通过从.debug / libatomic到usr / lib / libatomic的符号链接来强行强制使用它。这也没有达到预期的效果。