Ubuntu20下CMake链接本地dlt-daemon库找不到-ldlt问题问询
问题根因分析
核心问题分为两类:构建命令存在多处错误、Log库的CMake配置没有将DLT的依赖属性传递给下游项目。
1. 现有CMake命令的错误
- 路径不匹配:你实际的dlt安装路径是
/home/map/third_party,但命令中所有路径都写成了/home/manoj/third_party,路径完全不匹配 - 错误设置无效变量:
IMPORTED_LOCATION、INTERFACE_INCLUDE_DIRECTORIES、INCLUDE_DIRECTORIES都是CMake的目标属性,不是全局可配置的变量,设置后不会生效 - 未配置pkgconfig搜索路径:pkg-config默认不会扫描你本地的third_party目录,找不到你自己编译的dlt对应的pc文件,就会尝试找系统版本的dlt,找不到就会导致下游链接失败
另外你安装系统dlt包后出现未定义引用,是因为Ubuntu20源里的dlt版本远低于2.18.8,没有dlt_user_log_write_sized_utf8_string这个高版本新增的接口,所以必须全链路都使用你自己编译的dlt版本。
2. Log库CMake配置的缺陷
你用pkg_search_module找到DLT之后,只链接了${DLT_LIBRARIES}(只有库名,没有路径),但没有将DLT的头文件路径、库搜索路径作为PUBLIC属性传递给下游,所以依赖Log库的应用/其他库,不知道要去/home/map/third_party/lib下找libdlt.so,就会报cannot find -ldlt的错误。
解决方案
步骤1:修正构建命令
替换为以下修正后的命令,删除无效变量,补全正确的路径配置:
cmake --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DARA_ENABLE_TESTS=OFF \ -DPKG_CONFIG_PATH=/home/map/third_party/lib/pkgconfig \ -DCMAKE_LIBRARY_PATH=/home/map/third_party/lib \ -DCMAKE_PREFIX_PATH=/home/map/third_party \ -DCMAKE_INSTALL_PREFIX=/home/map/third_party \ -DCMAKE_BUILD_TYPE=Release ..
步骤2:修正Log库的CMake配置(二选一即可,推荐方案2)
方案1:传递依赖路径给下游
在Log库src目录的CMakeLists.txt中,补充头文件路径和库搜索路径的PUBLIC配置:
target_include_directories(${PROJECT_NAME} PUBLIC ${DLT_INCLUDE_DIRS} ) target_link_directories(${PROJECT_NAME} PUBLIC ${DLT_LIBRARY_DIRS} ) target_link_libraries(${PROJECT_NAME} PUBLIC ${DLT_LIBRARIES} ara::core-types apd::Threads )
方案2:直接链接完整库路径(更稳妥,不会出现路径传递问题)
直接使用pkg_search_module返回的DLT_LINK_LIBRARIES(已经是完整的库文件路径)代替DLT_LIBRARIES,下游不需要额外搜索库路径:
target_link_libraries(${PROJECT_NAME} PUBLIC ${DLT_LINK_LIBRARIES} ara::core-types apd::Threads )
修改完成后先重新编译Log库,再编译下游的应用和库即可正常链接。
内容的提问来源于stack exchange,提问作者mapppppp
相关产品推荐
相关产品推荐

