代码之家  ›  专栏  ›  技术社区  ›  KeyC0de

如何通过MSVS 2017 x64命令行将链接器选项传递给“cl”?

  •  1
  • KeyC0de  · 技术社区  · 6 年前

    我有一个小程序,我想通过命令行执行。我从IDE内部运行它,它运行得很好。我复制了整个编译命令并将其粘贴到MSVS命令提示符上,得到了未解决的符号链接器错误(我以前在一些不需要传递链接器选项的程序上这样做过)。

    我已经阅读了需要详细说明的文档 /link linker-options (来自 here here ,它应该说明如何指定链接器选项。但事实并非如此,这只是一个参考 link.exe . 我需要用水管吗 cl 命令到 ,以后需要执行吗 ? 我也找不到一个例子。

    只是为了测试,简单的程序 main.cpp 具体如下:

    #include <iostream>
    #include <Windows.h>
    #include <string>
    
    int main()
    {
        DWORD pid;
        HWND hwnd = FindWindow(0, L"Calculator");
        GetWindowThreadProcessId(hwnd, &pid);
        if (hwnd) {
            std::cout << "Window is open, id = " << pid;
        }
        else {
            std::cout << "Window not found" << '\n';
        }
        system("Pause");
    }
    

    /JMC /permissive- /we"4239" /GS /Zc:rvalueCast /W3 /Zc:wchar_t /ZI /Gm- /Od /Fd"x64\Debug\vc141.pdb" /Zc:inline /fp:precise /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /std:c++17 /FC /Fa"x64\Debug\" /EHsc /nologo /Fo"x64\Debug\" /Fp"x64\Debug\GetProcessByName.pch" /diagnostics:classic

    和链接器部分: /OUT:"J:\nik\Documents\Visual_Studio_Projects\GetProcess\x64\Debug\GetProcessByName.exe" /MANIFEST /NXCOMPAT /PDB:"J:\nik\Documents\Visual_Studio_Projects\GetProcess\x64\Debug\GetProcessByName.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X64 /INCREMENTAL /PGD:"J:\nik\Documents\Visual_Studio_Projects\GetProcess\x64\Debug\GetProcessByName.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Debug\GetProcessByName.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /TLBID:1

    正如迈克所说,我把它们结合起来如下 cl [compile-options] main.cpp /link [linker-options] 并从 主.cpp

    输出为: c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.1 5.26726\include\xlocale(319): warning C4530: C++ exception handler used, but unw ind semantics are not enabled. Specify /EHsc C:\Users\nik\documents\Visual_Studio_Projects\GetProcess\GetProcessByName\m ain.cpp : fatal error C1083: Cannot open compiler generated file: 'x64\Debug" /E Hsc /nologo /Fox64\Debug".asm': Invalid argument

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mike Kinghan Luchian Grigore    6 年前

    我们看到的分析错误是由以下选项引起的:

    /Fa"x64\Debug\"
    

    这个 documentation of /Fa 规定在下列情况下:

    /Fa directory\
    

    \

    /Fa filename
    

    你做到了, 将目录名放在引号中- "x64\Debug\" .

    当Windows外壳( cmd )执行命令时使用的 解析它处理的命令行 报价内 "..." 逃跑

    因此,尾随 逃逸 " 属于 “x64\调试\” 以及 directory\ 的参数 继续执行命令的后续选项,直到 最后,编译器确定了形式:

    /Fa文件名
    

    'x64\Debug" /E Hsc /nologo /Fox64\Debug".asm'
    

    转义引用的路径名中的反斜杠

    更改:

    /Fa“x64\Debug\”
    

    收件人:

    /Fa"x64\\Debug\\"
    

    命令行选项中的其他路径名也是如此。

    更改:

    /Fa“x64\Debug\”
    

    /Fax64\Debug\
    

    只有当路径中有嵌入空格时,才需要引用路径名

    使用 / \ 作为路径名分隔符

    更改:

    收件人:

    /Fa"x64/Debug/"
    

    命令行中的其他路径名也是如此。Windows是唯一的 \ 作为路径名分隔符。其他使用 / ,而Windows 在最近的版本中都接受。

    / 用作路径分隔符( "x64/Debug/" / /Fa公司 ), cl 还允许您使用unix样式的选项,例如。 -Fa /Fa公司 .

    使用 作为路径 分离器。

    如果你用其中一种方法 只有 要修复中的分析错误,请执行以下操作:

    随后的选项将引发相同的分析错误:

    /Fo"x64\Debug\"
    

    因此,将选择的解决方案一致地应用于整个命令行。