提问人:disharm0niz 提问时间:3/10/2023 最后编辑:disharm0niz 更新时间:3/10/2023 访问量:147
编译器和链接器标志的问题,无法为 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
问:
我正在尝试编写一个独立的 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
答:
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
*.asm
ml.exe
评论
main()
extern "C"