DxC*_*xCK 11 c++ windows runtime visual-c++
我正在使用Visual Studio 2005.
我想编译一个简单的程序,该程序可以与任何Windows 32位版本一起使用,而不依赖于安装的c ++运行时库版本.
该程序将在没有任何其他函数调用的情况下调用GetModuleHandle和GetProcAddress函数,然后在退出代码是函数地址时退出.
如何编译只依赖于kernel32.dll和user32.dll的C++程序,而没有任何c ++运行时库?
/NODEFAULTLIB在项目选项下设置.在较新版本的Visual C++中,您还必须关闭堆栈溢出检查,因为这些会导致编译器自动插入对库函数的调用.
编辑:如果您的意思是"在任何32位Windows版本上运行",您还必须使用editbin更改PE标头中的子系统版本字段.否则,在使用VC++ 2005链接器构建时,您将被限制在(IIRC)Windows 2000及更高版本中,而较新版本的VC++甚至更糟(默认情况下需要XP).Windows 2000是5.0,除了Win9x之外,您还需要指定3.5或更低版本以允许所有版本的NT.
您需要定义自己的入口点,而不是使用main或WinMain.你的入口点是一个不带参数的void函数.您必须为链接器指定其名称/entry:funcName(其中funcName将替换为您希望用作入口点的函数的名称).
执行此操作时,您还必须将子系统指定给链接器,如/subsystem:console.它通常根据它找到的函数名称推导子系统(即main- > console,WinMain- > Windows),但是当您使用自己的入口点时,必须明确指定它.尽管您可能不经常这样做,但即使您没有指定自己的入口点,也可以显式指定子系统,因此(例如)您可以将其main用作Windows子系统程序的入口点,或者WinMain作为入口指向控制台程序.
| 归档时间: |
|
| 查看次数: |
3740 次 |
| 最近记录: |