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

时间:2009-06-17 08:53:08

标签: visual-studio dll build cmake

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

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

此外,我找不到调试我的CMake脚本的简单方法,例如查看它为PATH变量分配的值。使用CMAKE_VERBOSE_MAKEFILE设置CMake详细信息无济于事。我将如何自己调试?

6 个答案:

答案 0 :(得分:42)

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

检查包含生成的.vcproj文件的目录,以查找.user文件中的用户设置。以下是我们使用的示例UserTemplate.vcproj文件的片段。

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

这样,您可以将CMake中所需的任何变量注入.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}.vcproj.${SYSTEM_NAME}.${USER_NAME}.user)
SET(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE})
CONFIGURE_FILE(UserTemplate.user ${USER_FILE} @ONLY)

答案 1 :(得分:10)

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

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

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

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

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

然后使它更通用。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:3)

您可以使用新的VS_USER_PROPS目标属性(版本&gt; = 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 :(得分:2)

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

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

答案 5 :(得分:1)

只想指出一个非常有用的补充 允许您设置多个环境变量,而不是仅设置一个(例如,仅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;与下一个变量之间不能有空格。