G++编译链接的那些事
语言 CPP
前言
  虽然 VSCodeC++ 编辑器非常受大家的欢迎,无论是大佬还是小白都说对其爱不释手...
  我...用了一段时间后发现实在是麻烦,配置往往花费我大量时间。可以说真的是吃力不讨好(个人观点,不代表其他人)!所以,用了一段时间后我又默默的用起了自己的 HBuilderX !
  淦! HBuilderX 不是主力前端吗?额~是的,CPP在这里不是很受宠,但没关系啊(主要是真的好用)!CPP的基本语法还是支持的,再加上自己完善了一下“自定义CPP代码块”后更是如虎添翼!HBuilderX NB!
  不过,有个最大的问题就是编译链接!因为 HBuilderX 本身并不是为CPP开发的,所以根本不会有这一功能,更苦的是连个插件都没得...一切都只能靠命令行!
  经过一段时间的摸索,最后打算写一篇总结。力求简洁、明了!
  不定期更新!
  提示:文件结构如下
+-- demo.cpp
|
+-- demo.ico
|
+-- demo.rc
第一章 - 静态编译
手动编译:
- 打开 CMD 命令窗口;
- 执行命令 g++ -c demo.cpp -o step_one.o;
- 执行命令 ar -cr libstep_two.a step_one.o;
- 执行命令 g++ demo.cpp -L. -Istep_two -static -o release.exe;
- 得到 release.exe 应用程序。
注释:
- 原理我不多说了,有兴趣的自行了解!力求简洁、明了!
- step_one 与 step_two 字符可替换;
- release.exe 为输出应用程序的名字;
批处理脚本:
::使用方法 - 直接将 demo.cpp 托入批处理运行即可,也可使用 CMD 命令传参数的方式执行。
@echo off
set start=%1
:get_o
if exist %1 (g++ -c %start% -o step_one.o) else (goto get_o)
:get_a
if exist .\o.o (ar -cr libstep_two.a step_one.o) else (goto get_a)
:get_exe
if exist .\liba.a (g++ %start% -L. -Istep_two -static -o release) else (goto get_exe)
:del
del DEL /F /A /Q step_one.o
del DEL /F /A /Q libstep_two.a
call release.exe
:end
第二章 - 自定义程序 ICO
手动操作:
- 在 demo.rc 文件中添加 id ICON "path/to/my.ico";
- 执行命令 windres demo.rc -O coff -o demo.res;
- 执行命令 g++ demo.cpp demo.res -o release.exe;
- 得到带 ICO 的应用程序。
注释:
- 原理大致为: 资源文件(.res) + 源文件(.cpp) =编译=> 带资源的应用程序(.exe);
- 第三步也可以使用静态编译:g++ -c demo.cpp -o step_one.o->ar -cr libstep_two.a step_one.o->g++ demo.cpp demo.res -L. -Istep_two -static -o release.exe。
批处理脚本:
还没写
第三章 - 添加版本信息
手动操作:
- 在 demo.rc 文件中添加
1 VERSIONINFO
FILEVERSION    1,0,0,0 // 文件版本
PRODUCTVERSION  1,0,0,0
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "080904E4" // 语言(修改前四位)
   BEGIN
     VALUE "CompanyName", "公司名"
     VALUE "FileDescription", "文件描述"
     VALUE "FileVersion", "1.0"
     VALUE "InternalName", "内部名称"
     VALUE "LegalCopyright", "版权"
     VALUE "OriginalFilename", "原始文件名"
     VALUE "ProductName", "产品名称"
     VALUE "ProductVersion", "产品版本"
   END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x809, 1252 // 翻译
  END
END
- 执行命令 windres demo.rc -O coff -o demo.res;
- 执行命令 g++ demo.cpp demo.res -o release.exe;
- 得到带版本信息的应用程序。
注释:
- .RC 文件使用的是微软定义的脚本语言;
- 更改语言时需要同时更改 “语言” 和 “翻译” 两处内容。“语言” 行("080904E4")修改前四个数字;“翻译” 行(0x809)修改后三位数字。
- Example: 简体中文的 langID 为 0x0804
- 修改“语言”行前四位为 “0804”;
- 修改“翻译”行后三位为 “804”;
- 修改“语言”信息为“简体中文”。
 
 
- Example: 简体中文的 langID 为 0x0804
- .RC资源文件详情请参考MSDN。
原创说明
本文原作者:SeaFever
转载请留言!
原文链接:https://www.cnblogs.com/seafever/p/12660507.html
G++编译链接的那些事的更多相关文章
- 从四个问题透析Linux下C++编译&链接
		摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ... 
- 如何使用g++编译调用dll的c++代码
		本文将有以下4个部分来讲如何使用g++编译调用dll的c++代码. 1.如何调用dll 2.动态链接和静态链接的区别 3.g++的编译参数以及如何编译调用dll的c++代码 4.总结 1.如何调用dl ... 
- linux学习之编译-链接
		在Windows下使用习惯了IDE,导致我们对程序的编译链接没有一个清晰的认识,甚至混淆了编辑器和编译器的概念.在学习Linux时,这些问题就暴露出来了. 实际上,我们应该严格区分一个程序从产生到执行 ... 
- gcc与g++的编译链接的示例详解
		一.编译方式的示例详解 1. 编译C代码 代码如下:main.c /*! ************************************************************** ... 
- 学习总结:gcc/g++ 编译与链接
		gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ... 
- 【转】关于编译链接——gcc/g++
		添加运行时共享库目录 运行使用共享库的程序需要加载共享库(不同于G++ 编译时指定的链接库),添加共享库的步骤: 修改文件 /etc/ld.so.conf 添加共享库目录 运行 ldconfig 同步 ... 
- 迁移到MSYS2 与 Qt 工具链注意的几个事情(g++在链接时,符号依赖项查找遵循从左至右的顺序,但qmake会自动合并造成错误。使用脚本给Mingw32-make创造出一个局部的VC编译环境)
		Microsoft Visual Studio 2015社区版提供了强大的开发体验,且 Qt 提供了预编译版本.然而,由于客户提出兼容Windows XP ~ Windows 8.1 这样宽泛的环境要 ... 
- [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)
		在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ... 
- g++编译流程
		测试程序test.cpp如下所示: #include <iostream> using namespace std; #define MAX 9 int main() { //just f ... 
随机推荐
- wpf xaml CS0426 错误原因
			wpf 程序集中 类命名空间名称和类名不能相同,否则在 xaml生成 i.g.cs时,会导致 自动生成代码无法推到处是类型还是命名空间的问题. 触发这个错误的条件是类命名空间 与 类名相同 并 ... 
- 插了带蠕虫的U盘后,文件不见了怎么快速恢复
			朋友插了别人U盘,电脑中毒,找到我,在网上找了一些教程,好多都是用杀软的,懒的下,亲测本教程简单有效 首先,我们创建了一个reg文件(注册表文件),如下, 利用REG文件我们可以直接对注册表进行任何修 ... 
- 学习mybatis框架时配置xml文件解决select莫名其妙报错问题
			遇到这种情况,如果语法没有错误,那就可能是你的eclipse在耍你!!! 怎么弄呢,重新建立一个文件,把原来的代码复制到新的文件中就ok啦!不用谢我,我叫雷锋 
- 使用IDEA操作Hbase API 报错:org.apache.hadoop.hbase.client.RetriesExhaustedException的解决方法:
			使用IDEA操作Hbase API 报错:org.apache.hadoop.hbase.client.RetriesExhaustedException的解决方法: 1.错误详情: Excepti ... 
- [JVM教程与调优] 什么是JVM运行时参数?
			我们接着上一章节[JVM教程与调优] JVM都有哪些参数类型?的内容继续讲解,这章我们来介绍一下:如何查看JVM运行时参数.这一点十分重要,因为我们在进行JVM参数调优的时候,我们首先得知道目前系统运 ... 
- POS-商户手续费-从生活剖析,通俗易懂
			前言 我们大家日常都在使用pos机,尤其是买衣服,吃火锅,都习惯刷卡.pos机带来的消费便利,也正是市场 对经济的一种促进手段. 今天主要分享下商户手续费这个概念,引出这个概念前,我们先大概说点别的东 ... 
- 使用VS开始一个新项目配置外部库的新手总结
			在使用VS做一个项目的时候,往往会需要使用各种各样的库,一般一个标准的外部库目录大体结构为: VS在配置这些库的时候有多种可行方法,但是不同的方法对于项目后续的管理和移植有不同的影响,我使用过以下三种 ... 
- kaggle入门——泰坦尼克之灾
			目录 引言 数据认识 总结 特征处理 建模预测 logistic分类模型 随机森林 SVM xgboost 模型验证 交叉验证 学习曲线 高偏差: 高方差 模型融合 总结 后记 引言 一直久闻kagg ... 
- Linux和Windows环境下安装Nginx
			Nginx的安装 windows环境下安装Nginx 安装 Nginx 的下载地址如下: http://nginx.org/en/download.html 选择时尽量选择 Stable 稳定版本,点 ... 
- Synchronized锁机制和ReentrantLock
			Synchronized Java中的每个对象都可以作为锁. 普通同步方法,锁是当前实例对象. 静态同步方法,锁是当前类的class对象. 同步代码块,锁是括号中的对象. 锁的内部机制 一般锁有4种状 ... 
