adding symbols: DSO missing from command line
🚨 错误信息
/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解决方案
好的,专业报错分析助理已就位。缺少链接库:你的代码
上下文:这发生在使用 CMake 进行交叉编译(目标架构为 明确依赖关系:在 CMake 中,使用
️ 利用 pkg-config:如果库提供了
错误翻译
原文: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) 去链接这个库。aarch64,编译环境为 x86_64)的链接阶段。链接器找到了包含目标符号的文件(libuuid.so.1),但由于库没有被显式指定,它拒绝链接。解决方案
你需要在 CMake 配置中,为链接 Common 库(或使用 Uuid.cpp 的目标)添加对 libuuid 的链接依赖。
找到定义目标 Common 的 CMakeLists.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
️ 预防措施
find_package() 或 find_library() 来显式声明和查找外部库依赖,这能让 CMake 更好地管理链接标志,并能在配置阶段早期发现缺失的库。.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})