0

总之,我正在尝试使用 cl.exe 从命令行编译一些 c++ 代码。在你问之前,这个想法是从另一个程序中实际调用这个 cl.exe 命令,该程序动态定义要传递给 cl.exe 的预处理器定义。另外,我正在开发一个可再发行的 cl.exe,这就是为什么有所有的 include 和 lib 路径。

这是 cl.exe 命令:

cl.exe /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D:SERVER=\"{address}\" /D:PORT=\"{port}\" /D:PROTOCOL=\"{protocol}\" /D _UNICODE /D UNICODE /Gm- /EHsc /MT /GS- /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo:.\\Clients\\ /Fd:.\\Clients\\vc140.pdb /Gd /TP /analyze- /errorReport:prompt /I.\\src /I.\\Compiler\\include /I.\\Compiler\\include\\ucrt /I.\\Compiler\\include\\um /I.\\Compiler\\include\\shared .\\src\\*.cpp /link /ERRORREPORT:PROMPT /OUT:\".\\Clients\\{name}.exe\" /NOLOGO /LIBPATH:.\\Compiler\\lib /MANIFEST /manifest:embed /PDB:\".\\Clients\\{name}.pdb\" /OPT:REF /OPT:ICF /LTCG:incremental /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\".\\Clients\\{name}.lib\" /MACHINE:X86 /SAFESEH /NODEFAULTLIB:msvcrt

重要的部分就在开头:

cl.exe ... /D:SERVER=\"{address}\" /D:PORT=\"{port}\" /D:PROTOCOL=\"{protocol}\"

这些是我试图传递到我的程序中的定义,括号内的值将在我的其他程序中定义。在命令行中输入“192.168.1.2”、“4444”和“TCP”之类的任意值来测试它提供的结果与我的程序相同,因此这不是问题。

这是我的 C++ 代码片段,它试图根据这些定义定义变量:

int main()
{
    std::string srv = "";
    std::string prt = "";
    std::string pro = "";

    #ifdef SERVER
    srv = SERVER;
    #endif

    #ifdef PORT
    prt = PORT;
    #endif

    #ifdef PROTOCOL
    pro = PROTOCOL;
    #endif

    if (srv == "" || prt == "" || pro == "") {
        printf("ERROR: VALUES EMPTY!\n");
        system("pause");
        return 11;
    }

    //For fun...
    printf("Server: %s\nPort: %s\nProtocol: %s\n", srv.c_str(), prt.c_str(), pro.c_str());

    return 0;
}

当我执行 cl.exe 命令时,它可以正确编译,但我得到“错误:VALUES EMPTY!” 每次。我无法弄清楚为什么定义没有通过。

4

0 回答 0