dll-如何使用CMake和Visual Studio设置路径环境变量来运行Tes

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

您是否已将CMake与Visual Studio一起使用? 请分享您的经验。

另外,我找不到调试CMake脚本的简便方法,例如查看它为PATH变量分配了什么值。 用CMAKE_VERBOSE_MAKEFILE设置CMake冗长无济于事。 我将如何自行调试?

amit asked 2020-08-12T04:26:42Z
5个解决方案
42 votes

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

检查包含生成的UserTemplate.vcxproj.user文件的目录,以查找CMakeLists.txt文件中的用户设置。 这是我们使用的示例.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 -->

设置PATH变量的UserTemplate.vcxproj.user的另一个示例是:

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

CMakeLists.txt文件旁边设置UserTemplate.vcxproj.user文件,您可以将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)
pkit answered 2020-08-12T04:27:10Z
10 votes

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

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

我从来没有设置路径来运行我的测试。 您正在使用CTest吗? 看来您跟随的链接与ctest一起使用了。

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

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

然后使其更通用。

iain answered 2020-08-12T04:27:44Z
5 votes

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

[HTTP://呜呜呜.看完widgets.org/bug/view.PHP?ID=8884]

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

mloskot answered 2020-08-12T04:28:13Z
3 votes

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

参考资料

  • CMake问题#8884:使用CMake设置Visual Studio项目“自定义环境变量”设置
  • 从CMakeLists.txt设置诊断:插入符号
Florian answered 2020-08-12T04:28:55Z
1 votes

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

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

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

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

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

另请注意,&#xA;和下一个变量之间不能有任何空格。

Francisco Martinez answered 2020-08-12T04:29:35Z
translate from https://stackoverflow.com:/questions/1005901/how-to-set-path-environment-variable-using-cmake-and-visual-studio-to-run-test