gcc 如何使用VSCode将逗号分隔的选项传递给g++链接器?

axkjgtzd  于 2022-11-13  发布在  Vscode
关注(0)|答案(2)|浏览(196)

我需要将参数**-Wl,-Bstatic,--整个存档**传递给g++。

"version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "shell: g++.exe build active file",
            "command": "C:\\MinGW\\x86\\bin\\g++.exe",
            "args": [
                "-g",
                "${file}",
                "-Wl,-Bstatic,--whole-archive",
                "-Xlinker",
                "-Map=${fileDirname}\\${fileBasenameNoExtension}.map",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "C:\\MinGW\\x86\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build"
        }
    ]
}

它会在终端中输出这个。

Executing task: C:\MinGW\x86\bin\g++.exe -g 'c:\Users\remi\Desktop\OK - VSCode\loaderstack.cpp' -Wl,-Bstatic,--whole-archive -Xlinker '-Map=c:\Users\remi\Desktop\OK - VSCode\loaderstack.map' -o 'c:\Users\remi\Desktop\OK - VSCode\loaderstack.exe' <

    At line:1 char:84
    + ... e -g 'c:\Users\remi\Desktop\OK - VSCode\loaderstack.cpp' -Wl,-Bstatic ...
    +                                                                 ~
    Missing argument in parameter list.
    At line:1 char:93
    + ... Users\remi\Desktop\OK - VSCode\loaderstack.cpp' -Wl,-Bstatic,--whole- ...
    +                                                                 ~
    Missing argument in parameter list.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : MissingArgument

有没有办法在VSCode内部使用这些逗号分隔的参数进行构建?

x6h2sr28

x6h2sr281#

我最初回答这个问题(就像一个哑巴哑巴),好像你在使用Linux,所以我删除了这个答案,并包括了一个新的PowerShell。
这是开发人员在Powershell中使用GCC时的一个常见问题。问题在于,PowerShell在实现其接口和执行命令的方式上是非常程序化的。在Linux中,CLI都是开源的(大多数),并且由开发人员开发,其中powershell是由一家公司创建的,它规定了每个小细节是如何工作的。(两者都有好处,也都有坏处)。PowerShell有方面/特性(或者你想怎么称呼它们),感觉就像编程语言所具有东西,例如PowerShell has scopes,传递给powershell的内容将根据上下文进行解析(或作用域)。您要处理的问题是,您的命令、您通过VS Code v2 Task处理GCC时,由于任务将其处理给Power-shell时所处的上下文,因此无法正确解析GCC。

您有两个选择

选项1

* 第一个选项是使用解析器可以正确交互命令的范围。*

请记住,您使用的是VSCode任务powershell & gcc,为了确保在这三个任务之间成功通信,您需要在通信中包含要使用的作用域。为此,我们要使用

呼叫操作员&

要使用调用运算符只需格式化初始命令即可执行,如下面的代码块所示:

"command": "& C:\\MinGW\\x86\\bin\\g++.exe",
* 我知道这是一个有效的解决方案,您的问题,我目前在一个Linux系统,我有Windows双启动,但我懒得切换到它,所以只是在情况下需要调整,使用的呼叫操作员我张贴在上面的链接,MS文档是非常好的,非常具体的关于如何实现其软件技术 *

选项2

你的第二个选择与第一个选择完全不同。

您将处理Power-shell无法解析MingW GCC命令的问题,而不是处理作用域问题。

为了处理Power-shell的解析问题,我们将告诉它停止解析命令,此后,将停止解析命令。

停止剖析旗标--%

(For开发人员的语义策略类型:我认为它在技术上是一个象征,而不是一面旗帜)
使用旗标的方式如下所示:gcc %--
因此,整个命令应该看起来像这样:

"args": [
                "--%"
                "-g",
                "${file}",
                "-Wl,-Bstatic,--whole-archive",
                "-Xlinker",
                "-Map=${fileDirname}\\${fileBasenameNoExtension}.map",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
同样,我为上面的stop-parsing标记提供了文档链接,以防需要调整某些内容。

我上面展示的例子是我在一个项目中使用的东西,我工作了很长一段时间,因为那个经验,我更喜欢使用no
还有一些我不太了解的东西,当我读到我DDG到微软网站的链接时,可能会,也许工作是使用参数模式,这似乎类似于停止解析命令?
如果你想了解更多,请点击这里。

jchrr9hc

jchrr9hc2#

我应该说,我没有尝试过这种方法,但我认为它会起作用。

**我建议你在powershell中使用'**来转义,。在你的配置文件中尝试这样做:

"-Wl`,-Bstatic`,--whole-archive",

我不确定它是否有效,但既然它对echo hell,o,o有效,我想一切都会好起来的。请告诉我这种方法是否有效。

相关问题