代码之家  ›  专栏  ›  技术社区  ›  amit kumar

如何使用CMake和Visual Studio设置Path环境变量以运行测试

  •  40
  • amit kumar  · 技术社区  · 15 年前

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

    此外,我没有找到调试CMake脚本的简单方法,例如查看它为PATH变量指定了什么值。使用设置CMake verbose CMAKE_VERBOSE_MAKEFILE 没有帮助。我将如何亲自调试它?

    5 回复  |  直到 15 年前
        1
  •  42
  •   MiguelVega pkit    5 年前

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

    检查包含生成的 .vcxproj 使用者 文件夹。下面是一个示例片段 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 -->
    

    UserTemplate.vcxproj.user 要设置PATH变量,请执行以下操作:

        <?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>
    

    UserTemplate.vcxproj.user CMakeLists.txt 文件中,可以将CMake中所需的任何变量注入 .vcxproj.user 您构建的项目的文件。 在CMake中,您可以设置适当的CMake变量(如果需要,还可以在模板文件中添加更多变量)。接下来,您可以执行类似的操作来配置文件。

        # Find user and system name
        SET(SYSTEM_NAME $ENV{USERDOMAIN} CACHE STRING SystemName)
        SET(USER_NAME $ENV{USERNAME} CACHE STRING UserName)
    
        # Configure the template file
        SET(USER_FILE ${_projectName}.vcxproj.${SYSTEM_NAME}.${USER_NAME}.user)
        SET(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE})
        CONFIGURE_FILE(UserTemplate.vcxproj.user${USER_FILE} @ONLY)
    

    如果您不关心系统和用户名,下面的配置就足够了。

        # Configure the template file
        SET(USER_FILE ${_projectName}.vcxproj.user)
        SET(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE})
        CONFIGURE_FILE(UserTemplate.vcxproj.user ${USER_FILE} @ONLY)
    
        2
  •  10
  •   plasmacel example    6 年前

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

    MESSAGE( STATUS "static text ${variable}" )
    

    如果我想让它发挥作用,我会用 set_tests_properties

    set_tests_properties(SomeTest PROPERTIES ENVIRONMENT "PATH=c:\somedir;c:\otherdir")
    

    那就让它更一般化。

        3
  •  5
  •   Florian    7 年前

    您可以使用新的 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"
    ) 
    

    工具书类

        4
  •  5
  •   mloskot    7 年前

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

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

    更新:根据解决 Set Visual Studio project "custom environment variables" setting with CMake -感谢Florian在下面的评论。

        5
  •  3
  •   Vishwesh    5 年前

    Cmake有一个VS_DEBUGGER_环境属性,可用于设置自定义路径

    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}")
    

    其他一些有用的属性有VS_调试器_命令_参数、VS_调试器_工作目录。

        6
  •  1
  •   Francisco Martinez    6 年前

    我只是想指出一个非常有用的补充 允许您设置多个环境变量,而不是仅设置一个(例如,仅设置路径) 在这个链接中给出 https://stackoverflow.com/a/40531167/9253113

    例如,如果除了设置路径之外,您还想设置另一个变量OTHERVAR

    <LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
    

    <LocalDebuggerEnvironment>PATH=C:\Test &#xA;OTHERVAR="value of OTHERVAR"</LocalDebuggerEnvironment>
    

    符号在哪里?” &#xA; 如果由LF字符分隔(CR字符也起作用,但组合CRLF不起作用),则可能

    还请注意,两个选项之间不能有任何空格 &#xA; 下一个变量。