如何在CMake中构建和添加依赖项库
对于我的项目,我需要构建并包含另一个库,作为我的依赖项 Toku也是使用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如下
$ 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
executabletoku
目标应该已经构建”,请使用add_dependencies(project_1_cpp toku)
@Tsyvarev,我不确定我在做什么。我尝试使用add\u custom\u命令
。我现在得到的是依赖项目标“../libtdoku.a”of target“project_1_cpp”不存在。
Hmm我得到了库编译,但得到了类似/usr/bin/ld:DWARF错误:在偏移量b090处找不到变量规范。