adding symbols: DSO missing from command line

2026年01月08日 17:38 状态: processing

🚨 错误信息

/usr/local/oecore-x86_64/sysroots/x86_64-oesdk-linux/usr/libexec/aarch64-oe-linux/gcc/aarch64-oe-linux/13.4.0/ld: ../Common/CMakeFiles/Common.dir/Utils/src/Uuid.cpp.o: undefined reference to symbol 'uuid_unparse_lower@@UUID_1.0' /usr/local/oecore-x86_64/sysroots/x86_64-oesdk-linux/usr/libexec/aarch64-oe-linux/gcc/aarch64-oe-linux/13.4.0/ld: /usr/local/oecore-x86_64/sysroots/oryon-1-oe-linux/lib64/libuuid.so.1: error adding symbols: DSO missing from command line

🤖 AI解决方案

好的,专业报错分析助理已就位。

错误翻译


原文:undefined reference to symbol 'uuid_unparse_lower@@UUID_1.0'
译文:对符号‘uuid_unparse_lower@@UUID_1.0’的引用未定义


原文:error adding symbols: DSO missing from command line
译文:添加符号时出错:命令行中缺少 DSO(动态共享对象)

原因分析

这是一个典型的链接器错误。根本原因是:

  • 缺少链接库:你的代码 Uuid.cpp 中使用了来自 libuuid 库的函数 uuid_unparse_lower,但在编译链接的命令行中,没有告诉链接器 (ld) 去链接这个库。

  • 上下文:这发生在使用 CMake 进行交叉编译(目标架构为 aarch64,编译环境为 x86_64)的链接阶段。链接器找到了包含目标符号的文件(libuuid.so.1),但由于库没有被显式指定,它拒绝链接。
  • 解决方案

    你需要在 CMake 配置中,为链接 Common 库(或使用 Uuid.cpp 的目标)添加对 libuuid 的链接依赖。

    找到定义目标 CommonCMakeLists.txt 文件(可能在 ../Common/CMakeLists.txt),并进行如下修改:

    cmake

    在 target_link_libraries 命令中添加 uuid


    target_link_libraries(Common
    # ... 你的其他依赖项 ...
    uuid
    )

    如果使用的是 find_package 方式,可能需要先查找该库:

    cmake
    find_package(UUID REQUIRED) # 如果CMake支持这个模块
    target_link_libraries(Common
    # ...
    ${UUID_LIBRARIES}
    )

    或者,如果简单的 uuid 无效,可能需要指定完整的库名或路径(在交叉编译环境中常见):

    cmake
    target_link_libraries(Common
    # ...
    -luuid
    # 或者在某些情况下需要指定完整路径
    # /usr/local/oecore-x86_64/sysroots/oryon-1-oe-linux/lib64/libuuid.so
    )

    修改后,清理并重新构建你的项目:

    bash
    cd your_build_directory
    rm -rf *
    cmake ..
    make

    ️ 预防措施

  • 明确依赖关系:在 CMake 中,使用 find_package()find_library() 来显式声明和查找外部库依赖,这能让 CMake 更好地管理链接标志,并能在配置阶段早期发现缺失的库。

  • ️ 利用 pkg-config:如果库提供了 .pc 文件,在 CMake 中使用 find_package(PkgConfig)pkg_check_modules() 是管理复杂依赖的最佳实践,它能自动处理链接库和包含目录。例如:

  • cmake
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(UUID REQUIRED uuid)
    target_link_libraries(YourTarget ${UUID_LIBRARIES})
    target_include_directories(YourTarget PRIVATE ${UUID_INCLUDE_DIRS})