如何使用CMake和Visual Studio运行测试来设置路径环境变量

ami*_*mit 42 dll build cmake visual-studio

我正在使用CMake生成Visual Studio项目文件.我想在设置PATH环境变量后运行测试可执行文件,以便它能够加载所需的dll.我根据http://www.mail-archive.com/cmake@cmake.org/msg21493.html上的讨论尝试过,但它不起作用.

您是否为此目的使用CMake和Visual Studio?请分享您的经验.

此外,我找不到调试我的CMake脚本的简单方法,例如查看它赋予PATH变量的值.设置CMake详细CMAKE_VERBOSE_MAKEFILE没有帮助.我将如何自己调试?

pki*_*kit 42

要从CMake在Visual Studio中设置自定义项目设置,您可以使用XML文件作为模板,可以从CMake配置该模板作为.user文件.
在我的工作中,我们使用它来设置自定义调试参数.

检查包含.vcxproj文件中用户设置的生成文件的.user目录.这是UserTemplate.vcxproj.user我们使用的示例文件的片段.

    <?xml version="1.0" encoding="Windows-1252"?>
      <VisualStudioUserFile
        ProjectType="Visual C++"
        Version="9.00"
        ShowAllFiles="false"
        >
        <Configurations>
            <Configuration
                Name="Debug|@USERFILE_PLATFORM@"
                >
                <DebugSettings
                    Command="@USERFILE_COMMAND_DEBUG@"
                    WorkingDirectory="@USERFILE_WORKING_DIRECTORY_DEBUG@"
                    CommandArguments="@USERFILE_COMMAND_ARGUMENTS_DEBUG@"
                    Attach="false"
                    DebuggerType="3"
                    Remote="1"
                    RemoteMachine="@USERFILE_REMOTE_MACHINE_DEBUG@"
                                <!-- More settings removed for snippet -->
                />
            </Configuration>
                <!-- Rest of Configurations -->
Run Code Online (Sandbox Code Playgroud)

这样,您可以将任何需要的变量从CMake注入到UserTemplate.vcxproj.user文件中.在CMake中,您可以设置适当的CMake变量(如果需要,可以在模板文件中添加更多变量).接下来,您可以执行以下操作来配置文件.

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
        <LocalDebuggerEnvironment>PATH=..\Your_path;%PATH%".</LocalDebuggerEnvironment>
        <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
      </PropertyGroup>
    </Project>
Run Code Online (Sandbox Code Playgroud)

  • 我对此进行了扩展,包括支持VS2010 - 请参阅https://github.com/rpavlik/cmake-modules/blob/master/CreateLaunchers.cmake中的CreateLaunchers.诀窍是,生成此项时无法打开visual studio - 它会在退出时覆盖此文件. (4认同)

iai*_*ain 10

刚刚发现了这个问题.要调试我使用的cmake文件

MESSAGE( STATUS "static text ${variable}" )
Run Code Online (Sandbox Code Playgroud)

我从来没有设置路径让我的测试运行.你在使用CTest吗?看起来您关注的链接与ctest一起使用.

如果我试图让它工作,我会set_tests_properties先明确使用.

set_tests_properties(SomeTest PROPERTIES ENVIRONMENT "PATH=c:\somedir;c:\otherdir")
Run Code Online (Sandbox Code Playgroud)

然后使它更通用.


小智 7

Cmake 有一个 VS_DEBUGGER_ENVIRONMENT 属性,可用于设置自定义 PATH

https://cmake.org/cmake/help/v3.13/prop_tgt/VS_DEBUGGER_ENVIRONMENT.html

set(MY_PATH "PATH=%PATH%" ${MY_CUSTOM_PATH})
set_target_properties(MyTarget PROPERTIES VS_DEBUGGER_ENVIRONMENT "{MY_PATH}")
Run Code Online (Sandbox Code Playgroud)

其他一些有用的属性是 VS_DEBUGGER_COMMAND_ARGUMENTS、VS_DEBUGGER_WORKING_DIRECTORY。


mlo*_*kot 5

这是相关的CMake功能请求报告:

http://www.kwwidgets.org/Bug/view.php?id=8884

更新:使用CMake按照Set Visual Studio项目的“自定义环境变量”设置进行了解决 -感谢Florian在下面的评论。


Flo*_*ian 5

您可以使用新的VS_USER_PROPS目标属性(版本 >= 3.8)全局提供任何选项。

这是一个工作示例:

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(SetEnvPathTest)

file(WRITE main.cpp [=[
// http://en.cppreference.com/w/cpp/utility/program/getenv
#include <iostream>
#include <cstdlib>

int main()
{
    if(const char* env_p = std::getenv("PATH"))
        std::cout << "Your PATH is: " << env_p << '\n';
}
]=])
add_executable(${PROJECT_NAME} main.cpp)

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.Cpp.user.props" [=[
<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
  </PropertyGroup>
</Project>
]=])

set_target_properties(
    ${PROJECT_NAME}
    PROPERTIES
        VS_USER_PROPS "${PROJECT_NAME}.Cpp.user.props"
) 
Run Code Online (Sandbox Code Playgroud)

参考