cmake OUTPUT_VARIABLE
时间: 2023-09-09 13:06:19 浏览: 58
CMake的`OUTPUT_VARIABLE`选项用于指定一个变量来捕获执行命令时的输出结果。在CMake脚本中,你可以使用`execute_process`命令来执行外部的命令或脚本,并将结果保存在指定的变量中。
下面是使用`OUTPUT_VARIABLE`选项的示例代码:
```cmake
# 定义一个变量来保存输出结果
set(output_variable "")
# 使用execute_process执行命令,并将结果保存在output_variable中
execute_process(
COMMAND <command> <arguments...>
OUTPUT_VARIABLE output_variable
RESULT_VARIABLE result_variable
)
# 打印输出结果
message("Output: ${output_variable}")
```
在上面的示例中,你需要将`<command>`替换为要执行的命令,`<arguments...>`替换为命令的参数。执行命令后,输出结果会保存在`output_variable`中,你可以通过`${output_variable}`来访问输出结果。
请注意,`execute_process`命令还有其他选项可以使用,例如`ERROR_VARIABLE`用于捕获错误输出,`OUTPUT_STRIP_TRAILING_WHITESPACE`用于去除输出结果末尾的空格等。你可以根据需要进行调整和使用。
相关问题
execute_process(COMMAND sh -c "git symbolic-ref --short -q HEAD" OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND sh -c "git rev-list HEAD --abbrev=8 --abbrev-commit --max-count=1" OUTPUT_VARIABLE GIT_LAST_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND sh -c "git rev-list HEAD --count" OUTPUT_VARIABLE GIT_COMMITS_NUM OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND sh -c "git status --short --untracked-files=no | wc -l" OUTPUT_VARIABLE GIT_DIFF_STATUS OUTPUT_STRIP_TRAILING_WHITESPACE) if ( ${GIT_DIFF_STATUS} EQUAL "0" ) set(BUILD_VERSION "R${GIT_LAST_COMMIT}_${GIT_BRANCH}") else() set(BUILD_VERSION "R${GIT_LAST_COMMIT}M_${GIT_BRANCH}") endif() #build date string(TIMESTAMP DATETIME "%Y%m%d%H%M%S") #enable gdb debug symbol if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") message (STATUS "No CMAKE_BUILD_TYPE selected, defaulting to ${CMAKE_BUILD_TYPE}") endif() message (STATUS "The CMAKE_BUILD_TYPE is selected to ${CMAKE_BUILD_TYPE}") set(CMAKE_CXX_FLAGS_BASE "$ENV{CXXFLAGS} -pipe -Wall -Wno-unknown-pragmas -Wno-format-zero-length -lrt -Wno-ignored-attributes") #set(CMAKE_CXX_FLAGS_BASE "${CMAKE_CXX_FLAGS_BASE} -save-temps") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_BASE} -O2 -g") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_BASE} -O3") #set(CMAKE_DEBUG_POSTFIX _D) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CMAKE_COMMAND} -E time")
这段代码执行了一系列的命令,获取了与Git相关的信息,并设置了构建的版本号和日期。
首先,使用`execute_process`命令执行了一系列的`git`命令来获取Git的分支、最后一次提交、提交数量和文件差异状态的信息,并将结果保存到相应的变量中。
接下来,使用条件语句判断`${GIT_DIFF_STATUS}`的值是否为0。如果是0,说明没有文件差异,那么将构建版本号设置为"R${GIT_LAST_COMMIT}_${GIT_BRANCH}";否则,将构建版本号设置为"R${GIT_LAST_COMMIT}M_${GIT_BRANCH}"。
然后,使用`string(TIMESTAMP ...)`命令获取当前的日期和时间,并将结果保存到`DATETIME`变量中。
接着,检查是否定义了`CMAKE_BUILD_TYPE`变量。如果没有定义,将其设置为"Release",并输出一条消息表示默认使用了该选项。
然后,设置了编译器的基本选项`CMAKE_CXX_FLAGS_BASE`,包括一些通用的编译选项和库链接选项。
接着,根据构建类型设置了不同的编译选项。对于Debug类型,使用`-O2 -g`,表示开启优化级别2和调试符号。对于Release类型,使用`-O3`,表示开启优化级别3。
最后,通过`set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ...)`和`set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ...)`命令设置了编译和链接命令的时间控制,用于输出编译和链接的时间信息。
总之,这段代码通过执行Git相关的命令获取了版本和日期信息,并设置了相应的变量和编译选项。
# toplevel CMakeLists.txt for a catkin workspace # catkin/cmake/toplevel.cmake cmake_minimum_required(VERSION 3.0.2) project(Project) set(CATKIN_TOPLEVEL TRUE) # search for catkin within the workspace set(_cmd "catkin_find_pkg" "catkin" "${CMAKE_SOURCE_DIR}") execute_process(COMMAND ${_cmd} RESULT_VARIABLE _res OUTPUT_VARIABLE _out ERROR_VARIABLE _err OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ) if(NOT _res EQUAL 0 AND NOT _res EQUAL 2) # searching fot catkin resulted in an error string(REPLACE ";" " " _cmd_str "${_cmd}") message(FATAL_ERROR "Search for 'catkin' in workspace failed (${_cmd_str}): ${_err}") endif() # include catkin from workspace or via find_package() if(_res EQUAL 0) set(catkin_EXTRAS_DIR "${CMAKE_SOURCE_DIR}/${_out}/cmake") # include all.cmake without add_subdirectory to let it operate in same scope include(${catkin_EXTRAS_DIR}/all.cmake NO_POLICY_SCOPE) add_subdirectory("${_out}") else() # use either CMAKE_PREFIX_PATH explicitly passed to CMake as a command line argument # or CMAKE_PREFIX_PATH from the environment if(NOT DEFINED CMAKE_PREFIX_PATH) if(NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "") if(NOT WIN32) string(REPLACE ":" ";" CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH}) else() set(CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH}) endif() endif() endif() # list of catkin workspaces set(catkin_search_path "") foreach(path ${CMAKE_PREFIX_PATH}) if(EXISTS "${path}/.catkin") list(FIND catkin_search_path ${path} _index) if(_index EQUAL -1) list(APPEND catkin_search_path ${path}) endif() endif() endforeach() # search for catkin in all workspaces set(CATKIN_TOPLEVEL_FIND_PACKAGE TRUE) find_package(catkin QUIET NO_POLICY_SCOPE PATHS ${catkin_search_path} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) unset(CATKIN_TOPLEVEL_FIND_PACKAGE) if(NOT catkin_FOUND) message(FATAL_ERROR "find_package(catkin) failed. catkin was neither found in the workspace nor in the CMAKE_PREFIX_PATH. One reason may be that no ROS setup.sh was sourced before.") endif() endif() catkin_workspace()在哪添加target_link_libraries(your_target_name avcodec avformat swscale)
在您的 CMakeLists.txt 文件中,将 `target_link_libraries()` 指令添加到 `add_subdirectory("${_out}")` 的下方。具体位置如下所示:
```cmake
...
# include catkin from workspace or via find_package()
if(_res EQUAL 0)
set(catkin_EXTRAS_DIR "${CMAKE_SOURCE_DIR}/${_out}/cmake")
# include all.cmake without add_subdirectory to let it operate in same scope
include(${catkin_EXTRAS_DIR}/all.cmake NO_POLICY_SCOPE)
add_subdirectory("${_out}")
# Add the target_link_libraries() here
target_link_libraries(your_target_name avcodec avformat swscale)
else
# use either CMAKE_PREFIX_PATH explicitly passed to CMake as a command line argument
# or CMAKE_PREFIX_PATH from the environment
if(NOT DEFINED CMAKE_PREFIX_PATH)
if(NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "")
if(NOT WIN32)
string(REPLACE ":" ";" CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
else()
set(CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
endif()
endif()
endif()
...
endif()
...
```
请注意将 `your_target_name` 替换为您实际的目标名称。这将在生成目标时链接 avcodec、avformat 和 swscale 库。
如果您还有其他问题,请随时提问。