使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件
简述
C/C++开源库一般是一堆的头文件和源文件,做到声明和实现分离,减小单个模块大小,这在设计上是很好的,但是用起来稍显麻烦。在网上看到有好心人推荐了一个开源工具Amalgamate,专门用来对C/C++的头文件和源文件进行合并用的,于是尝试了一下。
编译过sqlite源码的应该知道,sqlite3源码包有一个是指包含sqlite3.h
、sqlite3_ext.h
、sqlite.c
等为数不多几个代码文件的(也有分开的),嵌入到项目中非常方便。这就是用Amalgamate进行合并的。
下载并编译Amalgamate
下载很简单,这里就不细述了
git clone https://github.com/vinniefalco/Amalgamate.git
编译也很简单,直接使用VS打开Amalgamate\Builds\VisualStudio2010\Amalgamate.vcxproj
,然后编译生成即可。
最后的示例下载中有我编译的程序。
# gcc 编译
g++ Amalgamate.cpp juce_core_amalgam.cpp -o Amalgamate -lpthread -ldl
# clang编译
clang++ Amalgamate.cpp juce_core_amalgam.cpp -o Amalgamate -lpthread -ldl
具体的使用可以参考程序的帮助信息。
将libuv合并为单一头文件和源文件版本(Windows下)
用于合并的模板文件编写可以参考https://github.com/vinniefalco/Amalgams.git中的几个。
以libuv
为例进行简单的说明。
先下载libuv
的源码,目录结构如下:
首先先合并头文件
先编写一个头文件uv_all.h
,里面把libuv-v1.9.1\include
下的文件都include
进来。
源码如下:
#include "android-ifaddrs.h"
#include "pthread-barrier.h"
#include "stdint-msvc2008.h"
#include "tree.h"
#include "uv.h"
#include "uv_all.h"
#include "uv-errno.h"
#include "uv-threadpool.h"
#include "uv-version.h"
#include "uv-win.h"
一个简单的做法就是cygwin或msys下使用命令ls *.h |xargs -I{} echo '#include "{}"'
直接输出。
因为我这里只做windows平台的,所以把多余的都给删除了。
实际上因为uv.h
已经把需要的都包含上了,所以这里直接使用uv.h
也就够了。
运行下面命令生成合并后的头文件
Amalgamate.exe -i C:\Users\o\Documents\code\libuv-v1.9.1\include -w "*.h;*.c" C:\Users\o\Documents\code\libuv-v1.9.1\include\uv.h uv.h
执行完上面命令后会在当前目录生成一个新的uv.h
文件,也就是合并后的文件。上面参数中-i
后面的是附加包含目录,也就是和gcc中使用的-I
是一样的。最后的uv.h
是输出文件名,前面的是输入的配置模板文件。
合并源码文件
合并源码文件的做法和合并头文件的做法是一致的,先写一个配置文件uv_win_all.h
(把src和src/win目录下所有文件都包含进来),内容如下:
#include "win/atomicops-inl.h"
#include "win/handle-inl.h"
#include "win/internal.h"
#include "win/req-inl.h"
#include "win/stream-inl.h"
#include "win/winapi.h"
#include "win/winsock.h"
#include "heap-inl.h"
#include "queue.h"
#include "uv-common.h"
#include "win/async.c"
#include "win/core.c"
#include "win/dl.c"
#include "win/error.c"
#include "win/fs.c"
#include "win/fs-event.c"
#include "win/getaddrinfo.c"
#include "win/getnameinfo.c"
#include "win/handle.c"
#include "win/loop-watcher.c"
#include "win/pipe.c"
#include "win/poll.c"
#include "win/process.c"
#include "win/process-stdio.c"
#include "win/req.c"
#include "win/signal.c"
#include "win/snprintf.c"
#include "win/stream.c"
#include "win/tcp.c"
#include "win/thread.c"
#include "win/timer.c"
#include "win/tty.c"
#include "win/udp.c"
#include "win/util.c"
#include "win/winapi.c"
#include "win/winsock.c"
#include "fs-poll.c"
#include "inet.c"
#include "threadpool.c"
#include "uv-common.c"
#include "version.c"
然后执行下面命令进行合并
Amalgamate.exe -i C:\Users\o\Documents\code\libuv-v1.9.1\include -i C:\Users\o\Documents\code\libuv-v1.9.1\src -w "*.h;*.c" C:\Users\o\Documents\code\libuv-v1.9.1\src\uv_win_all.c uv_win.c
合并后的文件中会遇到一些问题,需要手动修改一下。比如多出遇到uv_zero_
重定义的问题,这个需要把第一次定义之后出现的都全部注释掉。
还有会遇到error LNK2019: 无法解析的外部符号 _InterlockedOr,该符号在函数 _uv_tty_line_read_thread@4 中被引用
的问题,这个只需要使用VS2012之后的版本编译就没问题了。
合并后的源码及项目文件
这里不多说,直接放出下载链接 https://files.cnblogs.com/files/oloroso/libuv_webtest.7z
测试的代码部分来自于https://github.com/liigo/tinyweb.git
Amalgamate参数简单说明
参数 | 解释 |
---|---|
-s | 处理#include <xxx> 的行,即处理包含在系统目录中的头文件(通常我们只需要处理双引号括起来的) |
-w{wildcards} | 指定要处理的文件类型(后缀名),如果不是列表中指定的,那么即便使用#include包含也不会处理,默认设置是".cpp;.c;.h;.mm;*.m" |
-f {file|macro} |
在inlcude出现的所有行中强制重新指定文件或宏 |
-p {file|macro} |
避免在#include行中的后续出现中重新包含指定的文件或宏 |
-d {name}={file} | 如果宏{name}出现在include包含行中,使用{file}替代 |
-i {dir} | 在处理include包含时,可以在指定的{dir}目录中搜索文件 |
-v | 输出详细信息 |
使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件的更多相关文章
- C#程序(含多个Dll)合并成一个Exe
把C#程序(含多个Dll)合并成一个Exe的超简单方法 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一 ...
- 将WinForm程序(含多个非托管Dll)合并成一个exe的方法
原文:将WinForm程序(含多个非托管Dll)合并成一个exe的方法 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. ILMerge能把托管dl ...
- 利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe)
原文:利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe) 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了.这 ...
- C# 实现将多个word文档合并成一个word文档的功能
前段时间项目上遇到这么一个需求,需要将多个OCR识别的word文档合并成一个,于是就在网上找了找,自己修改了一下.在这里跟大家分享一下,希望有用的到的. 要做多word文档合并,首先要导入Micros ...
- 多个jar包合并成一个jar包(ant)
https://blog.csdn.net/gzl003csdn/article/details/53539133 多个jar包合并成一个jar 使用Apache的Ant是一个基于Java的生成工具. ...
- 多个DLL合并成一个DLL
多个DLL合并成一个DLL,把DLL合并到Exe中的解决方案 1:) 下载 http://download.microsoft.com/download/1/3/4/1347C99E-9DFB-425 ...
- 多个UIImage合并成一个UIImage
多个UIImage合并成一个UIImage 创建两个UIImage UIImage *image1 = [UIImage imageNamed:@"iOSDevTip"]; UII ...
- 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片)
解决 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片) 1.当我们写了一个Python的项目时,特别是一个GUI项目,我们特备希望它能成为一个在Windows系统可执行的EXE文件 ...
- 多个EXCEL文件合并成一个
Python的numpy处理起来会比较方便,有空实现一下,这里是Excel内部代码的方式: 合并方法如下: 1.需要把多个excel表都放在同一个文件夹里面,并在这个文件夹里面新建一个excel.如图 ...
随机推荐
- 详解申请微信h5支付方法,开通微信h5网页支付接口(转)
现在大街小巷的商家都在使用微信支付,但是一些商家使用的是个人微信收款,这个虽然很便利,但是如果你想要数据统计汇总,让客户在网络上在线付款,就需要用到微信的h5支付. 微信h5支付 今天子恒老师跟你分享 ...
- Entity Framework解决sql 条件拼接,完美解决 解决 不支持 LINQ 表达式节点类型“Invoke”【转】
传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...
- 图解 VS2015 如何打包winform 安装程序
http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio?lang=10 ...
- hdu 1242 找到朋友最短的时间 (BFS+优先队列)
找到朋友的最短时间 Sample Input7 8#.#####. //#不能走 a起点 x守卫 r朋友#.a#..r. //r可能不止一个#..#x.....#..#.##...##...#.... ...
- Spring3.X jdk8 java.lang.IllegalArgumentException
异常提示: javax.servlet.ServletException: Servlet.init() for servlet springMVC threw exception org.apach ...
- python爬取百度贴吧帖子
最近偶尔学下爬虫,放上第二个demo吧 #-*- coding: utf-8 -*- import urllib import urllib2 import re #处理页面标签类 class Too ...
- 在vim中注释多行
使用查找替换的方法 在linux中,文本每一行的起始标志是^,结束标志为$,因此使用vim搜索^并替换为^#即可. :10,20s/^/#/g 表示将10-20行添加注释,同理取消注释为: :10,2 ...
- python全栈开发day29-网络编程之socket常见方法,socketserver模块,ftp作业
一.昨日内容回顾 1.arp协议含义 2.子网,子网掩码 3.两台电脑在网络中怎么通信的? 4.tcp和udp socket编码 5.tcp和udp协议的区别 6.tcp三次握手和四次挥手,syn洪攻 ...
- 6-20 Ideal Path uva1599
第一个bfs很快 但是我第一次做还用了结构体 这题完全不需要 反而导致了代码非常乱 输入: 一开始我是用m二维数组储存颜色 vector path来储存路径 但是二维数组的下标是不够用的 ...
- 【Java】 剑指offer(50-2) 字符流中第一个只出现一次的字符
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字 ...