【问题标题】:Adding command line arguments to project将命令行参数添加到项目
【发布时间】:2015-05-07 14:48:00
【问题描述】:

我的问题与SO 有点相似,但不一样。

我使用以下内容创建了一个HelloWorld 程序:

add_executable( HelloWorld ${SRC} )

当我生成项目文件(例如 Visual Studio .sln 文件或 XCode .xcodeproj 文件)时。我想在执行程序时点击运行按钮并将一些命令行参数传递给HelloWorld,如下所示:

./HelloWorld --gtest_filter=Test_Cases1*

另请参阅SO,了解如何在 Visual Studio 中完成此操作。

是否可以在 CMakeList 文件中执行此操作?如果不是,为什么?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    为什么这么复杂?如here 所述,VS 和 CMake 开箱即用地支持此功能。 在 VS 中打开 CMakeLists.txt 文件,然后打开“调试和启动设置”(例如通过“CMake”菜单或通过在“解决方案资源管理器”中单击鼠标右键。例如:

    将您的程序参数添加到弹出的文件“launch.vs.json”中的“args”。

    {
      "version": "0.2.1",
      "defaults": {},
      "configurations": [
        {
          "type": "default",
          "project": "CMakeLists.txt",
          "projectTarget": "tests\\hellotest",
          "name": "tests\\hellotest with args",
          "args": ["argument after argument"]
        }
      ]
    }
    

    【讨论】:

    • 正如其他人所指出的,这很可能是特定于 IDE 的。它可能在 VS 中有效,但在其他 IDE 中无效?例如,您有机会在 Xcode 中进行测试吗?
    • VS express 不支持这个
    • 这似乎是使用 Visual StudioCMake 时的最佳解决方案,感谢分享。
    • 它在我的情况下不起作用(Visual Studio 2019)
    【解决方案2】:

    CMake 3.13.0 看起来像 add support 以下列目标属性的形式出现:

    • VS_DEBUGGER_COMMAND_ARGUMENTS - 为 Visual Studio C++ 目标设置本地调试器命令行参数。
    • VS_DEBUGGER_ENVIRONMENT - 为 Visual Studio C++ 目标设置本地调试器环境。

    它扩展了这些命令的使用,自 CMake 3.12 起可用:

    • VS_DEBUGGER_COMMAND - 为 Visual Studio C++ 目标设置本地调试器命令。
    • VS_DEBUGGER_WORKING_DIRECTORY - 为 Visual Studio C++ 目标设置本地调试器工作目录。

    【讨论】:

      【解决方案3】:

      这个答案是在 CMake 3.13 发布之前写的,所以现在已经过时了。还有一个answer showing solution with CMake 3.13+ 也可用。


      CMake 3.12 及更低版本对此没有内置支持。原因是 Visual Studio 项目属性的 Debugging 选项卡中的设置未存储在项目文件 (.vc[x]proj) 中,而是存储在特定于用户和机器的 .user 文件中,并且 CMake 不会生成这些。

      您可以在 CMake 中自己编写代码(我在工作中为我们的框架编写了代码)。该文件只是 XML,因此您可以根据需要预先填充它。它的结构很容易理解。例如,被调试程序的命令行参数存储在<DebugSettings> XML 元素(嵌套在<Configurations><Configuration>)内的CommandArguments 属性中。

      【讨论】:

      • 只要您使用 CMake >= 3.13.0,此答案就不再有效。见我的answer below
      【解决方案4】:

      如果您想将 E:\dev\IfcPL\examples\Trassierung.ifc 作为参数添加到 Visual Studio 2017 中的调试构建项目:

      project.vcxproj.user.in

      <?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'">
          <LocalDebuggerCommandArguments>E:\dev\IfcPL\examples\Trassierung.ifc</LocalDebuggerCommandArguments>
          <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
        </PropertyGroup>
      </Project>
      

      CMakeLists.txt

      add_executable(HelloWorld main.cpp) 
      configure_file(project.vcxproj.user.in ${CMAKE_BINARY_DIR}/HelloWorld.vcxproj.user) 
      

      【讨论】:

        【解决方案5】:

        不是 CMake 技巧。您可以这样做为调试版本设置默认 args

        int main(int argc,char* argv[])
        {   const char* command = argv[1];
            if(argc < 2)
            {             
        #ifdef _DEBUG
                command="hello";
        #else
                Usage();
                return 1;
        #endif
            }
        
        [ process command arg... ]
        

        【讨论】:

        • 这不是一个坏主意,并且完全独立于任何构建环境(好吧,只要它设置了_DEBUG)。
        • 但是当每个开发者的参数必须不同时,它就不起作用了。
        猜你喜欢
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多