在本教程中,我们将学习如何为 Visual Studio 编译项目配置图标,并使用 Inno Setup 创建安装包。我们将包括以下部分:
- 设置项目图标:在 Visual Studio 中配置 .exe 文件的图标,或者使用第三方工具替换编译后的图标。
- 创建安装包:使用 Inno Setup 编写脚本,创建安装包。
文章目录
- 1. 设置项目图标(默认为cocos logo 可跳过)
- 1.1 编译前:在 Visual Studio 中设置 .exe 文件的图标
- 1.2 编译后:使用第三方工具替换 .exe 文件的图标
- 2. 创建安装包
- 2.1 Inno Setup 脚本说明
- 2.2 完整脚本实现
- 2.3 构建运行
- 3. 阶段性小结
- 4. 进一步泛化尝试
- 4.1 主方法:使用 Visual C++ Redistributable Package
- 4.2 次方法1:使用 Dependency Walker 分析依赖项 (待验证)
- 4.3 次方法2:静态链接运行时库 (待验证)
- 5. 结论
1. 设置项目图标(默认为cocos logo 可跳过)
1.1 编译前:在 Visual Studio 中设置 .exe 文件的图标
-
准备图标文件:
确保你有一个 .ico 格式的图标文件。如果你的图标是 .png 格式,可以使用在线工具或图像编辑软件将其转换为 .ico 格式。 -
添加图标资源:
我们切换到资源视图之后,右键项目名–添加–资源:
在添加资源中选择 Icon,导入。
切换文件类型后,我们选择项目Resource内的favicon.ico文件即可。
双击导入的icon,页面如下:
- 启动编译,确认ico
重新清理解决方案,启动编译之后,我们确认下编译文件夹下的exe文件是否不再是原cocos的logo。
1.2 编译后:使用第三方工具替换 .exe 文件的图标
如果你已经编译好 .exe 文件并希望在编译后设置执行程序的logo,也可以使用第三方工具替换图标。
比如: Resource Hacker 官网 等可以直接替换图标,这里给出一个思路。(未尝试)
2. 创建安装包
使用 Inno Setup 创建安装包,包含自定义安装包的图标、应用名称和安装路径。
下载地址:Inno Setup 官方网站
下载完成后新建一个空脚本(iss文件),进行如下操作。
2.1 Inno Setup 脚本说明
我们基于以如下内容作为示例:
- 游戏编译文件夹路径为
E:\cocos\IceHockey\proj.win32\Release.win32
, - 图标路径为
E:\cocos\IceHockey\proj.win32\Release.win32\Resources\favicon.ico
, - 游戏名称是“冰球大作战”,
- 编译后的可执行文件名是
IceHockey.exe
。
首先,在脚本顶部定义参数:
#define MyAppName "冰球大作战"
#define MyAppVersion "1.0"
#define MyAppSource "E:\cocos\IceHockey\proj.win32\Release.win32"
#define MyAppExeName "IceHockey.exe"
#define MyAppIcon "E:\cocos\IceHockey\proj.win32\Release.win32\Resources\favicon.ico"
MyAppName
:应用程序的名称,将显示在安装向导和快捷方式中。MyAppVersion
:应用程序的版本号。MyAppSource
:游戏编译后的输出目录路径,包含可执行文件和资源文件。MyAppExeName
:应用程序的可执行文件名称。MyAppIcon
:应用程序的图标文件路径,将用于安装包和快捷方式图标。
在脚本部分相关配置如下:
-
[Setup]
部分:AppName
:安装程序显示的应用名称。AppVersion
:安装程序显示的应用版本。DefaultDirName
:应用程序的默认安装目录。DefaultGroupName
:开始菜单中的程序组名称。OutputBaseFilename
:生成的安装包文件名。Compression
和SolidCompression
:安装包的压缩选项。SetupIconFile
:安装程序的图标文件。
-
[Files]
部分:Source
和DestDir
:定义了要打包的文件及其目标目录。Flags: ignoreversion
:忽略文件版本检查。recursesubdirs
:递归包含子目录中的所有文件。
-
[Icons]
部分:Name
:快捷方式名称和位置。Filename
:快捷方式指向的可执行文件。IconFilename
:快捷方式使用的图标文件。
2.2 完整脚本实现
根据模板生成完整的 Inno Setup 脚本(iss文件):
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!#define MyAppName "冰球大作战"
#define MyAppVersion "1.0"
#define MyAppSource "E:\cocos\IceHockey\proj.win32\Release.win32"
#define MyAppExeName "IceHockey.exe"
#define MyAppIcon "E:\cocos\IceHockey\proj.win32\Release.win32\Resources\favicon.ico"[Setup]
; 安装程序信息
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename={#MyAppName}Setup
Compression=lzma
SolidCompression=yes
SetupIconFile={#MyAppIcon}[Files]
; 将所有游戏文件添加到安装包
Source: "{#MyAppSource}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppSource}\*.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppSource}\Resources\*"; DestDir: "{app}\Resources"; Flags: ignoreversion recursesubdirs[Icons]
; 创建桌面快捷方式
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; [Run]
; 安装完成后自动运行游戏
; Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
此时页面如下:
2.3 构建运行
随后点击构建中的编译或运行(Run),进行安装后测试游戏是否可以直接打开运行。
在我们安装Inno Setup 6的output目录中,即可看到我们的安装包:
点击后效果如下:
最终生成的页面图标如下:
3. 阶段性小结
通过上述步骤,即可在 Visual Studio 项目中设置 .exe 文件的图标,并使用 Inno Setup 创建包含自定义图标和安装路径的安装包。
至此即实现了cocos2dx游戏打包,我们可以发给其他游戏开发课程的同学了。
4. 进一步泛化尝试
但是,如果发给没有配置 Visual Studio 环境(缺失Microsoft Visual C++ Redistributable packages)的电脑,依旧运行不起来:
经尝试,找到电脑中此dll文件后放入打包目录中一起打包,则会出现下一个dll文件缺失:
显然,Microsoft Visual C++ Redistributable packages不仅仅包含这些,最关键的是,即便是手动找全了所有的dll,也不一定能成功。
手动逐一添加 DLL 文件虽然可以解决问题,但并不是最优雅和高效的方法。
4.1 主方法:使用 Visual C++ Redistributable Package
为了简化这个过程,将 Visual C++ Redistributable Package 安装程序包含在安装包中,并在安装过程中自动安装。这样可以确保目标机器上安装了所有必要的运行时库。
下载 Visual C++ Redistributable Package
- 前往 Microsoft Visual C++ Redistributable Packages 页面。
- 下载适用于cocos2dx应用程序的所有必要的 Visual C++ Redistributable Packages。例如,如果你使用了 Visual Studio 2013,下载相应的 redistributable 安装程序。
更新 Inno Setup 脚本以包含 Redistributable 安装程序
如上图所示,下载完成后,我们新建目录scripts存储Inno Setup脚本以及vc安装包。重新编写脚本如下,即可同步安装。
#define MyAppName "冰球大作战"
#define MyAppVersion "1.0"
#define MyAppSource "E:\cocos\IceHockey\proj.win32\Release.win32"
#define MyAppExeName "IceHockey.exe"
#define MyAppIcon "E:\cocos\IceHockey\proj.win32\Release.win32\Resources\favicon.ico"
#define VcRedist "vcredist_x64.exe"[Setup]
; 安装程序信息
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename={#MyAppName}Setup
Compression=lzma
SolidCompression=yes
SetupIconFile={#MyAppIcon}[Files]
; 将所有游戏文件添加到安装包
Source: "{#MyAppSource}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppSource}\*.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppSource}\Resources\*"; DestDir: "{app}\Resources"; Flags: ignoreversion recursesubdirs
; 添加 Visual C++ Redistributable 安装程序
Source: "{#VcRedist}"; DestDir: "{tmp}"; Flags: ignoreversion[Icons]
; 创建桌面快捷方式并使用自定义图标
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{#MyAppIcon}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{#MyAppIcon}"[Run]
; 安装 Visual C++ Redistributable
Filename: "{tmp}\{#VcRedist}"; Parameters: "/quiet /norestart"; StatusMsg: "Installing Visual C++ Redistributable..."; Flags: waituntilterminated
; 安装完成后自动运行游戏
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
4.2 次方法1:使用 Dependency Walker 分析依赖项 (待验证)
使用 Dependency Walker 分析依赖项,你可以提前知道所有需要包含的 DLL 文件。
- 下载并安装 Dependency Walker。
- 打开你的可执行文件(例如
FinalGame.exe
)。 - Dependency Walker 会显示所有依赖的 DLL 文件。记录所有需要的文件,然后将它们添加到 Inno Setup 脚本中。
4.3 次方法2:静态链接运行时库 (待验证)
很久之前尝试过,静态链接运行时库可以减少对外部 DLL 的依赖,但会增加可执行文件的大小。(似乎会从30M=>300M)
但是遗忘了具体流程。编译后得同样使用第三方工具对exe文件做打包。
在 Visual Studio 中配置静态链接运行时库
- 打开项目属性。
- 导航到
C/C++
->代码生成
。 - 在
运行时库
下,选择多线程 (/MT)
或多线程调试 (/MTd)
。 - 重新编译项目。
5. 结论
为了确保目标机器上运行你的应用程序时不会因为缺少运行时库而报错,推荐的方法是包含 Visual C++ Redistributable Package 并在安装时自动安装。这是一种简便且可靠的方式来处理所有必要的依赖项。你也可以使用 Dependency Walker 来识别所有依赖项并手动添加,但这可能会更繁琐。静态链接运行时库也是一种减少依赖的方法,但需要在项目配置中进行调整。