【问题标题】:Linking libraries using Cmake - not used directly [duplicate]使用 Cmake 链接库 - 不直接使用 [重复]
【发布时间】:2021-12-18 03:31:45
【问题描述】:

我是 Cmake 的新手。我正在使用 Ubuntu 20。

我在本地(/home/map/third_party)构建并安装了 dlt-daemon-2.18.8 并构建了日志库。

以下是日志库CMakeLists.txt的内容

find_package(PkgConfig REQUIRED)
pkg_search_module(DLT automotive-dlt REQUIRED)
message("*****   pkg_search_module DLT_MODULE_NAME = ${DLT_MODULE_NAME} *****")
message("*****   pkg_search_module DLT_FOUND = ${DLT_FOUND} *****")
message("*****   pkg_search_module DLT_LIBRARIES = ${DLT_LIBRARIES} *****")
message("*****   pkg_search_module DLT_LINK_LIBRARIES = ${DLT_LINK_LIBRARIES} *****")
message("*****   pkg_search_module DLT_LIBRARY_DIRS = ${DLT_LIBRARY_DIRS} *****")
message("*****   pkg_search_module DLT_LDFLAGS = ${DLT_LDFLAGS} *****")
message("*****   pkg_search_module DLT_LDFLAGS_OTHER = ${DLT_LDFLAGS_OTHER} *****")
message("*****   pkg_search_module DLT_INCLUDE_DIRS = ${DLT_INCLUDE_DIRS} *****")
add_subdirectory(src)

以下是 src 文件夹中 CMakeLists.txt 的一部分,它位于 Log 文件夹(主 CMAke 文件)中

target_link_libraries(${PROJECT_NAME}
    PUBLIC
        ${DLT_LIBRARIES}
        ara::core-types
        apd::Threads
)

以下是日志库 CMakeLists.txt 的输出,看起来没问题。

-- Checking for one of the modules 'automotive-dlt'
*****   pkg_search_module DLT_MODULE_NAME = automotive-dlt *****
*****   pkg_search_module DLT_FOUND = 1 *****
*****   pkg_search_module DLT_LIBRARIES = dlt;rt;pthread *****
*****   pkg_search_module DLT_LINK_LIBRARIES = /home/map/third_party/lib/libdlt.so;/usr/lib/x86_64-linux-gnu/librt.so;/usr/lib/x86_64-linux-gnu/libpthread.so *****
*****   pkg_search_module DLT_LIBRARY_DIRS = /home/map/third_party/lib *****
*****   pkg_search_module DLT_LDFLAGS = -L/home/map/third_party/lib;-ldlt;-lrt;-lpthread *****
*****   pkg_search_module DLT_LDFLAGS_OTHER =  *****
*****   pkg_search_module DLT_INCLUDE_DIRS = /home/map/third_party/include/dlt;/home/map/third_party/include *****
-- Configuring done

在此之后,我正在使用上述日志库构建 1 个应用程序和 2 个库,但它无法链接并出现以下错误

[100%] Linking CXX shared library libe2exf.so
/usr/bin/ld: cannot find -ldlt

[100%] Linking CXX shared library libe2e.so
/usr/bin/ld: cannot find -ldlt

[100%] Linking CXX executable execution-manager
/usr/bin/ld: cannot find -ldlt

如果我安装这两个组件(sudo apt-get install libdlt2 和 sudo apt-get install libdlt-dev),那么 2 个库(libe2exf.so 和 libe2e.so)正在构建但应用程序(执行管理器)失败,如下所示错误 /usr/bin/ld: /home/map/third_party/lib/libara_log.a(log_stream.cpp.o): 在函数ara::log::LogStream::operator<<(ara::core::Span<ara::core::internal::Byte const, 18446744073709551615ul>)':log_stream.cpp:(.text+0xbaf): undefined reference to dlt_user_log_write_sized_utf8_string' /usr/bin/ld: /home/map/third_party/lib/libara_log.a(log_stream.cpp.o): 在函数ara::log::LogStream::WithLocation(ara::core::internal::basic_string_view<char, std::char_traits<char> >, int)':log_stream.cpp:(.text+0xdc6): undefined reference to dlt_user_log_write_sized_utf8_string'

我不想安装 libdlt2 和 libdlt-dev,请告诉我如何将上面的 1 个应用程序和 2 个库链接到 /home/map/third_party/lib/libdlt.so;

在此先感谢您好,

我在本地(/home/map/third_party)构建并安装了 dlt-daemon-2.18.8 并构建了日志库。

以下是日志库CMakeLists.txt的内容

find_package(PkgConfig REQUIRED)
pkg_search_module(DLT automotive-dlt REQUIRED)
message("*****   pkg_search_module DLT_MODULE_NAME = ${DLT_MODULE_NAME} *****")
message("*****   pkg_search_module DLT_FOUND = ${DLT_FOUND} *****")
message("*****   pkg_search_module DLT_LIBRARIES = ${DLT_LIBRARIES} *****")
message("*****   pkg_search_module DLT_LINK_LIBRARIES = ${DLT_LINK_LIBRARIES} *****")
message("*****   pkg_search_module DLT_LIBRARY_DIRS = ${DLT_LIBRARY_DIRS} *****")
message("*****   pkg_search_module DLT_LDFLAGS = ${DLT_LDFLAGS} *****")
message("*****   pkg_search_module DLT_LDFLAGS_OTHER = ${DLT_LDFLAGS_OTHER} *****")
message("*****   pkg_search_module DLT_INCLUDE_DIRS = ${DLT_INCLUDE_DIRS} *****")

以下是日志库 CMakeLists.txt 的输出,看起来没问题。

-- Checking for one of the modules 'automotive-dlt'
*****   pkg_search_module DLT_MODULE_NAME = automotive-dlt *****
*****   pkg_search_module DLT_FOUND = 1 *****
*****   pkg_search_module DLT_LIBRARIES = dlt;rt;pthread *****
*****   pkg_search_module DLT_LINK_LIBRARIES = /home/map/third_party/lib/libdlt.so;/usr/lib/x86_64-linux-gnu/librt.so;/usr/lib/x86_64-linux-gnu/libpthread.so *****
*****   pkg_search_module DLT_LIBRARY_DIRS = /home/map/third_party/lib *****
*****   pkg_search_module DLT_LDFLAGS = -L/home/map/third_party/lib;-ldlt;-lrt;-lpthread *****
*****   pkg_search_module DLT_LDFLAGS_OTHER =  *****
*****   pkg_search_module DLT_INCLUDE_DIRS = /home/map/third_party/include/dlt;/home/map/third_party/include *****
-- Configuring done

在此之后,我正在使用上述日志库构建 1 个应用程序和 2 个库,但它无法链接并出现以下错误

[100%] Linking CXX shared library libe2exf.so
/usr/bin/ld: cannot find -ldlt

[100%] Linking CXX shared library libe2e.so
/usr/bin/ld: cannot find -ldlt

[100%] Linking CXX executable execution-manager
/usr/bin/ld: cannot find -ldlt

如果我安装这两个组件(sudo apt-get install libdlt2 和 sudo apt-get install libdlt-dev),那么 2 个库(libe2exf.so 和 libe2e.so)正在构建但应用程序(执行管理器)失败,如下所示错误

/usr/bin/ld: /home/map/third_party/lib/libara_log.a(log_stream.cpp.o): 在功能上 ara::log::LogStream::operator<<(ara::core::Span<ara::core::internal::Byte const, 18446744073709551615ul>)':log_stream.cpp:(.text+0xbaf): undefined reference to dlt_user_log_write_sized_utf8_string'

/usr/bin/ld: /home/map/third_party/lib/libara_log.a(log_stream.cpp.o): 在功能上 ara::log::LogStream::WithLocation(ara::core::internal::basic_string_view<char, std::char_traits<char> >, int)':log_stream.cpp:(.text+0xdc6): undefined reference to dlt_user_log_write_sized_utf8_string'

我不想安装 libdlt2 和 libdlt-dev,请告诉我如何将上面的 1 个应用程序和 2 个库链接到 /home/map/third_party/lib/libdlt.so;

我正在使用以下 cmake 命令进行构建。如果有错误请告诉我。

cmake --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DARA_ENABLE_TESTS=OFF \
-DIMPORTED_LOCATION=/home/manoj/third_party,/home/manoj/third_party/lib/pkgconfig \
-DINTERFACE_INCLUDE_DIRECTORIES=/home/manoj/third_party/include \
-DINCLUDE_DIRECTORIES=/home/manoj/third_party \
-DCMAKE_MODULE_PATH=/home/manoj/third_party/share/cmake-3.16/Modules \
-DCMAKE_PREFIX_PATH=/home/manoj/third_party \
-DCMAKE_INSTALL_PREFIX=/home/manoj/third_party \
-DCMAKE_BUILD_TYPE=Release ..

提前致谢

【问题讨论】:

  • 请在CMakeLists.txt 文件中添加链接库的部分。错误消息听起来很像您忘记添加target_link_directories(execution-manager PRIVATE ${DLT_LIBRARY_DIRS}) 或类似内容。此外,带有已安装库的版本的错误听起来像是您没有链接库,或者至少是不正确的版本...
  • 补充遗漏的部分,谢谢
  • 链接器只是不知道在哪里可以找到dlt 库。包含信息的变量有 3 个:DLT_LIBRARY_DIRSDLT_LDFLAGSDLT_LINK_LIBRARIES。以正确的方式使用其中任何一种都可以解决问题。您正在使用的 cmake 模块的文档提到了一个 IMPORTED_TARGET 选项,尽管它可以为您解决这个问题......
  • 啊!你的这个问题比上一个问题包含更多的信息。我终于能够为您的问题提供具体的帮助。请记住,好的问题需要有好的答案;)

标签: cmake cmakelists-options


【解决方案1】:

据我所知,您只需将链接目录添加到您的目标:

target_link_directories(${PROJECT_NAME}
    PUBLIC
        ${DLT_LIBRARY_DIRS}
)

这是因为DLT_LIBRARIES 不包含有关这些库的路径信息。路径信息包含在目录变量中。

您可以在DLT_LDFLAGS 中看到这一点,链接需要在链接到库之前添加目录。

更好的解决方案是使用 DLT 的导入目标(如果它导出一个),因为它会自行处理所有这些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 2021-11-15
    • 2017-05-29
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多