vs2013控制台应用程序使用v120_xp工具集编译后提示“不是有效的win32应用程序”

本文解决了一个在Visual Studio 2013中创建的控制台应用程序,使用v120_xp工具集编译后,在Windows XP上运行时提示“不是有效的Win32应用程序”的问题。通过调整链接器设置,指定正确的子系统和子系统版本,确保了应用程序在目标操作系统上的兼容性。

新建的一个vs2013控制台应用程序,在使用v120_xp工具集编译后,在windows xp上运行时,仍然提示“不是有效的win32应用程序”。

 

解决:

1、右键项目->属性->链接器->系统->子系统->选择“控制台 (/SUBSYSTEM:CONSOLE)”

2、右键项目->属性->链接器->系统->所需的最低版本->5.01

 

原文引用:(https://devblogs.microsoft.com/cppblog/windows-xp-targeting-with-c-in-visual-studio-2012/

" Specify the correct subsystem and subsystem version for the linker based on the type of application you are building. Applications targeting the x86 version of Windows XP must specify subsystem version 5.01, and applications targeting x64 must specify version 5.02.

For x86 console applications: 
set LINK=/SUBSYSTEM:CONSOLE,5.01 %LINK%

For x64 console applications:
set LINK=/SUBSYSTEM:CONSOLE,5.02 %LINK%

"

### 关于VS2013 v120工具集下的小型第三方库 在Microsoft Visual Studio 2013 (ToolsVersion 12.0) 中,`v120` 是默认的平台工具集。此工具集支持构建针对不同操作系统版本的应用程序,并提供了兼容性选项以便开发者能够为目标环境定制其应用程序[^1]。 对于寻找适用于 `VS2013`, 使用 `v120` 平台工具集并支持 x86 和 x64 架构的小型第三方库(version V9),以下是几个常见的选择: #### Boost 库 Boost 是一个广泛使用的C++开源库集合,它提供了一系列高质量的通用组件。Boost 支持多种编译器和平台配置,包括 VS2013 的 `v120` 工具集以及 x86 和 x64 架构。为了确保与特定版本的Visual Studio兼容,可以下载预编译二进制文件或者自行通过命令行构建所需的版本。例如,在构建过程中可以通过设置如下参数来指定目标架构和工具链: ```bash b2 toolset=msvc-12.0 address-model=64 variant=release link=static runtime-link=static --stagedir=./stage/x64 ``` 上述命令会基于 MSVC 12.0 编译器生成静态链接的 Release 版本库文件到指定目录下[^2]。 #### zlib 压缩库 zlib 提供高效的压缩功能,被许多项目所采用。它的源码可以直接用于各种开发环境中,包括使用 VS2013 配置为 `v120_xp` 或标准模式的情况。要创建适合 x86 及 x64 系统的目标文件,可通过修改 Makefile 文件中的宏定义实现。比如下面的例子展示了如何调整 CFLAG 参数以适应不同的需求场景: ```batch nmake -f win_makemakefile.msc INC_PATH=-I"C:\Program Files\Microsoft SDKs\Windows\v7.1A\Include" LIB_PATH="-LIBPATH:C:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib" ``` 这里指定了 Windows SDK 7.1A 路径作为头文件和库路径的一部分,这有助于保持向后兼容性特别是当目标最低系统版本较老时[^3]。 #### SQLite 数据库引擎 SQLite 是轻量级的关系数据库管理系统,完全嵌入应用内部工作而无需单独安装服务端软件。它可以轻松集成至任何规模大小不一的新旧工程里去。如果打算将其应用于由 VS2013 创建且采用了 `v120` 工具链管理的解决方案,则只需简单地把官方发布的 amalgamation 单独版加入工程项目即可完成基本操作的支持;而对于更高级别的特性则可能还需要额外处理一些细节问题像线程安全等。 --- ### 示例代码片段展示如何加载动态链接库 DLL 假设我们已经获取到了某个满足条件的小型第三方库如 libexample.dll ,那么可以在自己的项目中这样调用它们的方法之一就是利用 LoadLibrary API 函数动态载入库句柄之后再GetProcAddress 获取具体函数地址执行相应逻辑动作。 ```cpp #include <windows.h> typedef int (*ExampleFunction)(const char*); HMODULE hModule = LoadLibrary(TEXT("libexample.dll")); if (!hModule){ // Handle error loading dll... } else { ExampleFunction funcPtr = reinterpret_cast<ExampleFunction>(GetProcAddress(hModule , "example_function_name")); if(funcPtr != nullptr){ const char* inputStr="Test Input"; int resultValue =funcPtr(inputStr); FreeLibrary(hModule ); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值