编译器和链接器标志的问题,无法为 Visual Studio 2022 编译独立的 C++ 代码(独立于 std 和 OS)

Trouble with compiler and linker flags to compile free standing C++ code (independent of std and OS) for visual studio 2022

提问人:disharm0niz 提问时间:3/10/2023 最后编辑:disharm0niz 更新时间:3/10/2023 访问量:147

问:

我正在尝试编写一个独立的 C++ 代码,它应该独立于任何环境,就像裸机代码一样。为了做到这一点,我找到了这个项目。但是,Visual Studio 2022 中的情况发生了一些变化。

这些是我的编译器标志:

/GS /GY /GL /clr:nostdimport /clr:nostdlib /Zl *.cpp

这些是我的链接器标志:

/ENTRY:Test /NODEFAULTLIB /MACHINE:x64  *.obj

这是我的解决方案中唯一的cpp文件:

#include <cstdint>
int32_t Test()
{
int64_t Var1 = 0;
Var1++;
return 0;
}

当我尝试编译项目时,链接器抱怨入口点未定义。

fatal error LNK1561: entry point must be defined

虽然我清楚地定义了它。为什么我的代码无法编译? 我真的很感激任何帮助。

编辑:有关更多信息,我不想明确地成为切入点!main

C++ Windows Visual-Studio 编译 链接器错误

评论

2赞 πάντα ῥεῖ 3/10/2023
您需要一个函数来构建可执行程序。VTC作为错别字,main()
0赞 disharm0niz 3/10/2023
显然,我不希望主线成为我的切入点!我希望它是一个测试函数,你有没有看过链接的项目?
1赞 πάντα ῥεῖ 3/10/2023
然后,您需要提供自己的启动程序集代码,并使用该代码进行链接。
0赞 πάντα ῥεῖ 3/10/2023
另一个问题:你是交叉编译的吗?
2赞 teapot418 3/10/2023
也许是名字的麻烦?尝试将 添加到函数中。extern "C"

答:

0赞 disharm0niz 3/10/2023 #1

发布临时答案,以防将来有人遇到此问题。正如我所提到的,问题与旗帜有关。我们使用此标志仅生成文件,并在最后阶段链接所有文件。解决此问题后会出现的另一个问题是链接器将强制您选择子系统类型。正如我在谷歌上搜索的那样,似乎你对 Visual Studio 无能为力,Visual Studio 也将该部分添加到最终的 PE 中。但是,使用 IDAPro 检查部分中生成的代码时,如果您手动从那里提取操作码,它们似乎可以用作独立代码。 如果我找到更好的解决方案或手动提取操作码发生的任何特定问题,我将更新我的答案。 我使用的最终编译器标志:/c.obj.pdata'.txt'

ml64.exe /c *.asm
cl.exe /c /GS /GL /clr:nostdimport /clr:nostdlib /Zl *.cpp

我使用的最终链接器标志:

link.exe /ENTRY:Test /NODEFAULTLIB /MACHINE:x64 /DYNAMICBASE:NO /FIXED /SUBSYSTEM:WINDOWS /OUT:FinalStub.exe *.obj

PS:MASM()在我的情况下找不到文件,所以我必须手动添加文件。如果有人知道如何解决这个问题,如果您能在评论中写出解决方案,我将不胜感激。ml64.exe*.asmml.exe