【问题标题】:How to build and add a dependency library in CMake如何在 CMake 中构建和添加依赖库
【发布时间】:2020-09-05 11:14:59
【问题描述】:

对于我的项目,我需要构建并包含另一个库 https://github.com/t-dillon/tdoku/ 作为我的依赖项。

Toku 也是使用 CMake 构建的,我可以通过以下方式运行构建脚本:

$ cd lib/toku
$ ./BUILD.sh

这会将库文件放入./lib/tdoku/build/libtdoku.a。

我正在尝试在 CMake 中构建 Toku 库,并将其用作依赖项。我该怎么做?

我尝试使用add_custom_target、add_custom_command、add_dependencies、add_subdirectory 无济于事。

我当前的CMakeLists.txt 看起来像:

cmake_minimum_required(VERSION 3.17)
project(project_1_cpp)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wconversion")
set(CMAKE_CXX_FLAGS_DEBUG_INIT "")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3")

add_custom_target(toku)
add_custom_command(
  TARGET toku
  COMMAND ${CMAKE_SOURCE_DIR}/lib/tdoku/BUILD.sh
  WORKING_DIR ${CMAKE_SOURCE_DIR}/lib/tdoku
)

file(GLOB project_1_src "*.cpp")
add_executable(project_1_cpp ${project_1_src})
add_dependencies(tdoku project_1_cpp)
target_link_libraries(project_1_cpp ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a)

【问题讨论】:

  • 为什么这么多人倾向于使用add_custom_command(TARGET) flow?此命令流程适用于一些特定情况。在正常情况下,如果你知道COMMAND 的输出,则将其放入add_custom_command(OUTPUT) 流中。否则,将其直接放入add_custom_target 调用中。不知道你想通过add_dependencies(tdoku project_1_cpp)调用实现什么,但如果你想表达“为了构建我的project_1_cpp可执行toku目标应该已经构建”,使用add_dependencies(project_1_cpp toku)。
  • @Tsyvarev 我不太确定自己在做什么。我尝试改用add_custom_command。我现在收到The dependency target ".../libtdoku.a" of target "project_1_cpp" does not exist.
  • 嗯,我得到了库编译,但得到像 /usr/bin/ld: DWARF error: could not find variable specification at offset b090 这样的错误。

标签: cmake dependencies libraries cmake-custom-command


【解决方案1】:

在@Tsyvarev 的帮助下,我首先将CMakeLists.txt 更改为包括:

add_custom_command(
  OUTPUT ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a
  COMMAND ${CMAKE_SOURCE_DIR}/lib/tdoku/BUILD.sh tdoku
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib/tdoku
)
add_custom_target(project DEPENDS ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a)

关键是WORKING_DIR不起作用,我需要WORKING_DIRECTORY。我通过尝试修改build.sh 脚​​本并将其打印到文件中来解决这部分问题,这样我就可以知道它是否正在运行,以及脚本内部发生了什么问题。我意识到脚本的工作目录是错误的。

事实上,我相信我在发布问题之前已经完成了所有这些操作,但是之后我得到了以下错误,这让我认为 tdoku 库没有正确编译。是的,但它错误地链接到我的项目:

/usr/bin/ld: /usr/bin/ld: DWARF error: could not find variable specification at offset 223f
/usr/bin/ld: DWARF error: could not find variable specification at offset 22ba

我在 Google 上搜索了 "DWARF error: could not find variable specification",然后找到了 ld.exe: DWARF error: could not find variable specification at offset 101cee。谷歌搜索cmake flto 将我带到How do I enable link time optimization (LTO) with CMake?。

这终于让我可以编译我的项目了。

整个更改列表包括:

set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)

add_custom_command(
  OUTPUT ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a
  COMMAND ${CMAKE_SOURCE_DIR}/lib/tdoku/BUILD.sh tdoku
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib/tdoku
)
add_custom_target(project DEPENDS ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a)

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2021-08-17
    • 2011-12-25
    • 2016-08-23
    相关资源
    最近更新 更多