cmake 属性 VS_USER_PROPS 静默忽略

Posted

技术标签:

【中文标题】cmake 属性 VS_USER_PROPS 静默忽略【英文标题】:cmake property VS_USER_PROPS silently ignored 【发布时间】:2021-06-29 15:49:01 【问题描述】:

我尝试向 cmake 为 Visual Studio 2019 生成的项目添加几个现有的 props 文件(属性文件随 gstreamer 提供,我想将它们重用于 Windows 构建,而不是手动添加所有依赖项)。

我为此创建了一个 user.props 文件:

videolib.deps.props

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Label="LocalAppDataPlatform" />
    <Import Project="C:\gstreamer\1.0\msvc_x86_64\share\vs\2010\libs\glib-2.0.props" />
    <Import Project="C:\gstreamer\1.0\msvc_x86_64\share\vs\2010\libs\gstreamer-1.0.props" />
  </ImportGroup>
</Project>

我没有收到任何错误,但文件未添加到生成的项目中。

这是我的 CMakeLists.txt:

根目录:

cmake_minimum_required(VERSION 3.20)

set(CMAKE_VERBOSE 1)
project(videolib
                VERSION 0.1
                DESCRIPTION "A videoplayer library based on a gstreamer. Allows playback and simple editing of a video."
                LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
    include(CTest)
endif()

add_subdirectory(videolib)
#add_subdirectory(test-videolib)
#add_subdirectory(test-videolib-impl)

videolib子目录:

cmake_minimum_required(VERSION 3.20)

add_library(videolib-common INTERFACE)
target_sources(videolib-common INTERFACE
    src/videolib_impl.cpp
    src/videolib.cpp)
target_include_directories(videolib-common INTERFACE
    src
    include)

add_library(videolib SHARED)
target_link_libraries(videolib videolib-common)
set_target_properties(videolib PROPERTIES VS_USER_PROPS "videolib.deps.props")

配置过程中没有错误:

(env) d:\projects\videolib\build>cmake -S .. -G "Visual Studio 16 2019"
-- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.18363.
-- The CXX compiler identification is MSVC 19.27.29111.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: D:/projects/videolib/build

但是在构建期间 (cmake --build --config Debug .) 我收到一个错误,指出找不到 glib.h,这在未添加 gstreamer 依赖项时很典型。在生成的项目文件中也没有提到videolib.deps.props

【问题讨论】:

@ChrisMM 谢谢,添加$CMAKE_CURRENT_SOURCE_DIR/ 确实解决了这个问题。如果您将回复添加为答案,我会将其标记为 accepted 答案。 【参考方案1】:

试试:

set_property(
  TARGET videolib
  PROPERTY VS_USER_PROPS "$CMAKE_CURRENT_SOURCE_DIR/videolib.deps.props"
)

可能只是在错误的目录中搜索。

【讨论】:

VS_USER_PROPS 中的路径被逐字插入到 VS 项目文件中。因此,应始终使用某种形式的绝对路径。 (请注意,此行为允许您引用 msbuild 变量,例如 $(UserRootDir)$(Platform))。

以上是关于cmake 属性 VS_USER_PROPS 静默忽略的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV imread 静默失败的原因?

函数模板的部分属性在 GCC 中被静默忽略

将目标属性添加到 CMake 中现有的导入库

使用错误数量的参数调用 CMake 设置目标属性

Atitit 错误处理机制:静默模式警告模式 异常模式

cmake jar包无法执行:没有主清单属性