44

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

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

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

4

6 回答 6

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

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)
于 2009-08-20T17:47:46.313 回答
11

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

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

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

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

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

然后让它更通用。

于 2009-07-03T12:05:46.573 回答
5

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

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

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

于 2009-09-29T10:22:35.293 回答
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"
) 

参考

于 2017-11-25T20:55:41.433 回答
5

Cmake has a VS_DEBUGGER_ENVIRONMENT property which can be used to set the custom 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}")

Some other useful properties are VS_DEBUGGER_COMMAND_ARGUMENTS, VS_DEBUGGER_WORKING_DIRECTORY.

于 2019-11-04T05:49:55.840 回答
1

只是想指出,此链接https://stackoverflow.com/a/40531167/9253113中提供了一个非常有用的附加功能,它允许您设置多个环境变量,而不是仅设置一个(例如,只有 PATH)

例如,如果除了设置 PATH 您还想设置另一个变量 OTHERVAR ,则必须修改该行

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

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

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

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

于 2018-10-31T10:25:02.043 回答