1

对于我的项目,我需要构建并包含另一个库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)
4

1 回答 1

2

在@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。谷歌搜索cmake flto让我了解如何使用 CMake 启用链接时间优化 (LTO)?.

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

整个更改列表包括:

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)
于 2020-09-05T13:49:07.523 回答