Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在CMake中构建和添加依赖项库_Cmake_Dependencies_Libraries_Add Custom Command - Fatal编程技术网

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

如何在CMake中构建和添加依赖项库,cmake,dependencies,libraries,add-custom-command,Cmake,Dependencies,Libraries,Add Custom Command,对于我的项目,我需要构建并包含另一个库,作为我的依赖项 Toku也是使用CMake构建的,我可以通过以下方式运行一个构建脚本: $ cd lib/toku $ ./BUILD.sh 这会将库文件放入/lib/tdoku/build/libtdoku.a 我试图在CMake内部构建Toku库,并将其用作依赖项。我该怎么做 我尝试使用add\u custom\u target,add\u custom\u命令,add\u依赖项,add\u子目录,但没有成功 我当前的CMakeLists.txt如下

对于我的项目,我需要构建并包含另一个库,作为我的依赖项

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

$ cd lib/toku
$ ./BUILD.sh
这会将库文件放入
/lib/tdoku/build/libtdoku.a

我试图在CMake内部构建Toku库,并将其用作依赖项。我该怎么做

我尝试使用
add\u custom\u target
add\u custom\u命令
add\u依赖项
add\u子目录
,但没有成功

我当前的
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\u DIR
不起作用,我需要使用
WORKING\u 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:找不到变量规范”
,这让我想到了。谷歌搜索
cmakeflto
让我找到了

这最终使我能够编译我的项目

整个变更列表包括:

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)

为什么这么多人倾向于使用
add\u custom\u命令(TARGET)
flow?此命令流适用于某些特定情况。在正常情况下,如果您知道
命令的输出
,则将其放入
添加自定义命令(输出)
流中。否则,直接将其放入
add_custom_target
call。不确定通过
add_dependencies(tdoku project_1_cpp)
调用您想要实现什么,但是如果您想要表达“对于构建我的
project_1_cpp
executable
toku
目标应该已经构建”,请使用
add_dependencies(project_1_cpp toku)
@Tsyvarev,我不确定我在做什么。我尝试使用
add\u custom\u命令
。我现在得到的是
依赖项目标“../libtdoku.a”of target“project_1_cpp”不存在。
Hmm我得到了库编译,但得到了类似
/usr/bin/ld:DWARF错误:在偏移量b090处找不到变量规范。