【问题标题】:How to Set Path Environment Variable using CMake and Visual Studio to Run Test如何使用 CMake 和 Visual Studio 设置路径环境变量来运行测试
【发布时间】:2010-11-03 14:28:23
【问题描述】:

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

您是否将 CMake 与 Visual Studio 一起用于此目的?请分享您的经验。

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

【问题讨论】:

    标签: visual-studio dll build cmake


    【解决方案1】:

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

    检查包含生成的.vcxproj 文件的目录以了解.user 文件中的用户设置。这是我们使用的示例 UserTemplate.vcxproj.user 文件的 sn-p。

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

    【讨论】:

    • 这主要是可行的,但随后 VStudio 会覆盖我的新 .user 文件。如何指示 VStudio 使用不同的 .user 文件,或尊重我的更改?
    • @terry-lorber:今天我验证了上述方法确实适用于 VS2008SP1。我使用 CMake 创建了一个 .vcproj 文件,将其复制到了 Visual Studio 通常创建它的正确位置的 something.vcproj...user 文件中,当我查看.sln 文件在 VS IDE 中。
    • 我已经对此进行了扩展,包括支持 VS2010 - 请参阅 github.com/rpavlik/cmake-modules/blob/master/… 中的 CreateLaunchers@ 诀窍是生成此文件时无法打开 Visual Studio - 它会在退出时覆盖此文件。
    • Visual Studio (10) 可以打开,你只需要关闭解决方案。
    • 这是一个很好的解决方案,但我想知道示例的最后一行是否有错字。 CONFIGURE_FILE 应该写信给${OUTPUT_PATH} 吗?
    【解决方案2】:

    现在才发现这个问题。要调试 cmake 文件,我使用

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

    我从来不需要设置路径来运行我的测试。你在用 CTest 吗?您所关注的链接似乎与 ctest 一起使用。

    如果我想让它工作,我会首先明确使用set_tests_properties

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

    然后让它更通用。

    【讨论】:

      【解决方案3】:

      您可以使用新的 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】:

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

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

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

      【讨论】:

      【解决方案5】:

      Cmake 有一个 VS_DEBUGGER_ENVIRONMENT 属性,可以用来设置自定义路径

      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_DEBUGGER_COMMAND_ARGUMENTS、VS_DEBUGGER_WORKING_DIRECTORY。

      【讨论】:

        【解决方案6】:

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

        例如,如果除了设置 PATH 之外,您还想设置另一个变量 OTHERVAR 一个人将不得不修改这一行

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

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

        符号“&amp;#xA;”告诉 xml 解析器引入 LF 字符。所以多个变量定义 如果由 LF 字符分隔是可能的(CR 字符也有效,但不是组合 CRLF)

        还要注意&amp;#xA; 和下一个变量之间不能有任何空格。

        【讨论】:

        • 不适用于 Visual Studio Community 2019。查看下方的评估值窗口,您会发现这是错误的。
        • 我只在 2017 年之前在 VS 中测试过。
        猜你喜欢
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        相关资源
        最近更新 更多