我正在使用 CMake 生成 Visual Studio 项目文件。我想在设置 PATH 环境变量后运行测试可执行文件,以便它能够加载所需的 dll。我按照 http://www.mail-archive.com/[email protected]/msg21493.html 的讨论进行了尝试,但它不起作用。
您是否为此目的使用了 CMake 和 Visual Studio?请分享您的经验。
此外,我发现没有简单的方法来调试我的 CMake 脚本,例如查看它分配给 PATH 变量的值。使用
CMAKE_VERBOSE_MAKEFILE
设置 CMake 详细没有帮助。我该如何自己调试呢?
要从 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 -->
设置 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>
将
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)
现在才发现这个问题。为了调试 cmake 文件,我使用
MESSAGE( STATUS "static text ${variable}" )
我从来不需要设置路径来运行我的测试。你在使用CTest吗?看起来您所关注的链接与 ctest 一起使用。
如果我试图让它发挥作用,我会首先明确使用
set_tests_properties
。
set_tests_properties(SomeTest PROPERTIES ENVIRONMENT "PATH=c:\somedir;c:\otherdir")
然后使其更通用。
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。
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功能请求报告:
http://www.kwwidgets.org/Bug/view.php?id=8884
更新:按照使用 CMake 设置 Visual Studio 项目“自定义环境变量”设置解决 - 感谢 Florian 在下面的评论。
只是想指出一个非常有用的补充 允许您设置多个环境变量,而不是仅设置一个(例如,仅 PATH) 此链接中给出https://stackoverflow.com/a/40531167/9253113
例如,如果除了设置 PATH 之外您还想设置另一个变量 OTHERVAR 必须修改该行
<LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
到
<LocalDebuggerEnvironment>PATH=C:\Test 
OTHERVAR="value of OTHERVAR"</LocalDebuggerEnvironment>
其中符号“


”告诉xml解析器引入LF字符。所以多个变量定义
如果用 LF 字符分隔,则可以(CR 字符也有效,但组合 CRLF 无效)
另请注意,


和下一个变量之间不能有任何空格。