我正在使用一些外部库,这些库作为 git 子模块包含在该add_subdirectory
命令中。其中一些正在使用旧版本的 cmake,并发出有关策略 CMP0048 和 CMP0077 的警告。
有没有办法关闭这些库的所有 cmake 警告?
我尝试在包含项目之前明确设置策略,OLD
但没有帮助。
我不想编辑 git 子模块中的任何文件,因为当有人必须克隆我的项目的存储库并在他们的计算机上构建它时,就会有额外的步骤。
我不确定 CMakeif()
命令是否会将条件子句中的符号视为变量或字符串文字。所以我做了一些实验。
脚本1.cmake
cmake_minimum_required(VERSION 3.15)
set(XXX "YYY") #<========== HERE!!
if(XXX STREQUAL "XXX")
message("condition 1 is true") # If reach here, XXX is treated as string
elseif(XXX STREQUAL "YYY")
message("condition 2 is true") # If reach here, XXX is treated as variable
endif()
Run Code Online (Sandbox Code Playgroud)
输出是:
condition 2 is true
Run Code Online (Sandbox Code Playgroud)
所以我得出结论1。
对于条件子句中的符号:
然后我又做了一个实验。
set(ON "OFF")
if(ON)
message("condition 3 is true") # If reach here, ON …
Run Code Online (Sandbox Code Playgroud) 到目前为止,我已经看到INTERFACE
用于描述仅标头库的库类型,因为它不编译源代码并且不生成库工件。我见过的库类型IMPORTED
较少,但从我读到的内容来看,它用于描述已经在磁盘上的预编译库。
我最近看到一些带有IMPORTED INTERFACE
库类型的代码,并且对为什么使用它感到困惑。这种类型有哪些属性,这种类型的一些典型用例是什么?
我将 CMake v3.13.4 与Visual Studio 2017 Win64
生成器一起使用,我需要修改 Visual Studio Librarian(对于 CMake 对象库)的命令行选项。
为了实现这一点,CMake 提供了可以通过and命令STATIC_LIBRARY_OPTIONS
设置的目标属性。set_property
set_target_properties
文档指出STATIC_LIBRARY_OPTIONS
支持生成器表达式:
\n\n\n的内容
\nSTATIC_LIBRARY_OPTIONS
可以使用 \xe2\x80\x9c 生成器表达式\xe2\x80\x9d 和\n 语法$<...>
。有关可用表达式,请参阅cmake-generator-expressions(7) \n 手册。有关定义构建系统属性的更多信息,请参阅cmake-buildsystem(7) \n 手册。
但是:无论我尝试什么,这些值都没有正确转义\xc2\xb4,例如
\n\nset_property(TARGET object_library PROPERTY STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>)\n
Run Code Online (Sandbox Code Playgroud)\n\n在 Visual Studio 中会导致以下结果:
\n\nAll Options: `/OUT:"..." /LTCG /MACHINE:X64 /NOLOGO \nAdditional Options: %(AdditionalOptions) /machine:x64 ""$"<1:/WX" "/ERRORREPORT:NONE>"\n
Run Code Online (Sandbox Code Playgroud)\n\n我尝试了以下方法,但似乎都失败了。
\n\nset_property(TARGET object_library PROPERTY\n STATIC_LIBRARY_OPTIONS …
Run Code Online (Sandbox Code Playgroud) 我认为它应该是非常微不足道的,但似乎不支持它......在 CMake 中是否有可能让列表的一个值包含分号?
原因非常简单 - 因为我在 Windows 上运行,而在 Windows 上,分号是一个环境变量中两个或多个文件夹之间的分隔符(即PATH
)。
list(
APPEND
MY_TEST_ENVIRONMENT
"MY_FLAG=1"
)
# <...>
list(
APPEND
MY_TEST_ENVIRONMENT
"PATH=first_folder_path;second_folder_path"
# ^--- here is the problem
)
# <...>
set_property(TEST MyTests PROPERTY ENVIRONMENT ${MY_TEST_ENVIRONMENT})
Run Code Online (Sandbox Code Playgroud)
我尝试删除和添加双引号,我尝试转义\;
,我尝试添加相同的环境变量两次 - 但这些都不起作用!
在现代 CMake 中,可以将库指定为INTERFACE
:它不生成构建输出,但它可以具有与其关联的属性,尽管并非所有属性都可以设置(例如FOLDER
不支持该属性)。假设我有一个通用 CMake 宏为通用库目标设置属性,有没有办法告诉输入目标是接口库,以便我可以仅跳过该目标不受支持的属性?
target_include_directories
在此代码中,我在属性 INCLUDE_DIRECTORIES 和 INTERFACE_INCLUDE_DIRECTORIES 中添加字符串“${PROJECT_BINARY_DIR}”。但是,当我运行 Cmake 时,我发现命令中message
这两个属性为空。
cmake_minimum_required(VERSION 3.10)
# set the project name and version
project(Tutorial VERSION 1.0)
# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# configure a header file to pass some of the CMake settings
# to the source code
configure_file(TutorialConfig.h.in TutorialConfig.h)
# add the executable
add_executable(Tutorial tutorial.cxx)
# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
target_include_directories(Tutorial
PUBLIC "${PROJECT_BINARY_DIR}"
)
get_property(inc_dirs …
Run Code Online (Sandbox Code Playgroud) 我是 CMake 的新手,我想知道是否有可能target_sources()
根据变量排除某些来源。
假设我在下面有这个
target_sources(myTarget
PUBLIC
PRIVATE
myDir1/src/a.c
myDir2/src/b.c
myDir3/src/c.c
INTERFACE
)
target_include_directories(myTarget
PUBLIC
PRIVATE
myDir1/inc
myDir2/inc
myDir3/inc
INTERFACE
)
Run Code Online (Sandbox Code Playgroud)
我想根据名为 ie 的标志从 myDir3 中排除/包含源/目录myFlag
。我怎样才能做到这一点?
target_sources(myTarget
PUBLIC
PRIVATE
myDir1/src/a.c
myDir2/src/b.c
if(DEFINED myFlag)
myDir3/src/c.c
endif()
INTERFACE
)
target_include_directories(myTarget
PUBLIC
PRIVATE
myDir1/inc
myDir2/inc
if(DEFINED myFlag)
myDir3/inc
endif()
INTERFACE
)
Run Code Online (Sandbox Code Playgroud) 我想在构建后运行 POST_BUILD 操作(但仅在调试配置中)。
在阅读了add_custom_command 文档和可能的解决方案后,我明白我可以将我的命令“包装”到$<CONFIG:Debug>
生成器表达式中(以确保它在发布模式下为“空”)。
我尝试了以下方法:
cmake_minimum_required(VERSION 3.18)
project(post-build CXX)
file(WRITE main.cxx "int main() {}")
add_executable(foo main.cxx)
add_custom_command(
TARGET foo POST_BUILD
COMMAND $<$<CONFIG:Debug>:${CMAKE_COMMAND} -E echo "hi there from debug build">
)
Run Code Online (Sandbox Code Playgroud)
但这给了我 CMake 配置时警告和构建时的硬故障(使用 Ninja 生成器):
(...) && "$<1:C:\Program Files\CMake\bin\cmake.exe" -E echo "hi there from debug build" >""
[build] The system cannot find the path specified.
[build] ninja: build stopped: subcommand failed.
[build] Build finished with exit code 1
Run Code Online (Sandbox Code Playgroud)
我尝试了许多可能的引号组合(包括转义引号):
COMMAND $<$<CONFIG:Debug>:"${CMAKE_COMMAND} …