如何在 CMake 中构建和添加依赖库

How to build and add a dependency library in CMake

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

Toku 也是使用 CMake 构建的,并且有一个构建脚本我可以 运行 通过执行以下操作:

$ cd lib/toku
$ ./BUILD.sh

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

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

我尝试使用 add_custom_targetadd_custom_commandadd_dependenciesadd_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)

在@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

我用谷歌搜索 "DWARF error: could not find variable specification",这让我找到了 ld.exe: DWARF error: could not find variable specification at offset 101cee. Googling cmake flto led me to

这终于让我能够编译我的项目。

整个更改列表包括:

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)