使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件
簡(jiǎn)述
C/C++開(kāi)源庫(kù)一般是一堆的頭文件和源文件,做到聲明和實(shí)現(xiàn)分離,減小單個(gè)模塊大小,這在設(shè)計(jì)上是很好的,但是用起來(lái)稍顯麻煩。在網(wǎng)上看到有好心人推薦了一個(gè)開(kāi)源工具Amalgamate,專門用來(lái)對(duì)C/C++的頭文件和源文件進(jìn)行合并用的,于是嘗試了一下。
編譯過(guò)sqlite源碼的應(yīng)該知道,sqlite3源碼包有一個(gè)是指包含sqlite3.h、sqlite3_ext.h、sqlite.c等為數(shù)不多幾個(gè)代碼文件的(也有分開(kāi)的),嵌入到項(xiàng)目中非常方便。這就是用Amalgamate進(jìn)行合并的。
下載并編譯Amalgamate
下載很簡(jiǎn)單,這里就不細(xì)述了
git clone https://github.com/vinniefalco/Amalgamate.git編譯也很簡(jiǎn)單,直接使用VS打開(kāi)Amalgamate\Builds\VisualStudio2010\Amalgamate.vcxproj,然后編譯生成即可。
最后的示例下載中有我編譯的程序。
具體的使用可以參考程序的幫助信息。
將libuv合并為單一頭文件和源文件版本(Windows下)
用于合并的模板文件編寫可以參考https://github.com/vinniefalco/Amalgams.git中的幾個(gè)。
以libuv為例進(jìn)行簡(jiǎn)單的說(shuō)明。
先下載libuv的源碼,目錄結(jié)構(gòu)如下:
首先先合并頭文件
先編寫一個(gè)頭文件uv_all.h,里面把libuv-v1.9.1\include下的文件都include進(jìn)來(lái)。
源碼如下:
一個(gè)簡(jiǎn)單的做法就是cygwin或msys下使用命令ls *.h |xargs -I{} echo '#include "{}"'直接輸出。
因?yàn)槲疫@里只做windows平臺(tái)的,所以把多余的都給刪除了。
實(shí)際上因?yàn)閡v.h已經(jīng)把需要的都包含上了,所以這里直接使用uv.h也就夠了。
運(yùn)行下面命令生成合并后的頭文件
執(zhí)行完上面命令后會(huì)在當(dāng)前目錄生成一個(gè)新的uv.h文件,也就是合并后的文件。上面參數(shù)中-i后面的是附加包含目錄,也就是和gcc中使用的-I是一樣的。最后的uv.h是輸出文件名,前面的是輸入的配置模板文件。
合并源碼文件
合并源碼文件的做法和合并頭文件的做法是一致的,先寫一個(gè)配置文件uv_win_all.h(把src和src/win目錄下所有文件都包含進(jìn)來(lái)),內(nèi)容如下:
#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"然后執(zhí)行下面命令進(jìn)行合并
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合并后的文件中會(huì)遇到一些問(wèn)題,需要手動(dòng)修改一下。比如多出遇到uv_zero_重定義的問(wèn)題,這個(gè)需要把第一次定義之后出現(xiàn)的都全部注釋掉。
還有會(huì)遇到error LNK2019: 無(wú)法解析的外部符號(hào) _InterlockedOr,該符號(hào)在函數(shù) _uv_tty_line_read_thread@4 中被引用的問(wèn)題,這個(gè)只需要使用VS2012之后的版本編譯就沒(méi)問(wèn)題了。
合并后的源碼及項(xiàng)目文件
這里不多說(shuō),直接放出下載鏈接 https://files.cnblogs.com/files/oloroso/libuv_webtest.7z
測(cè)試的代碼部分來(lái)自于https://github.com/liigo/tinyweb.git
Amalgamate參數(shù)簡(jiǎn)單說(shuō)明
| -s | 處理#include <xxx>的行,即處理包含在系統(tǒng)目錄中的頭文件(通常我們只需要處理雙引號(hào)括起來(lái)的) |
| -w{wildcards} | 指定要處理的文件類型(后綴名),如果不是列表中指定的,那么即便使用#include包含也不會(huì)處理,默認(rèn)設(shè)置是".cpp;.c;.h;.mm;*.m" |
| -f {file|macro} | 在inlcude出現(xiàn)的所有行中強(qiáng)制重新指定文件或宏 |
| -p {file|macro} | 避免在#include行中的后續(xù)出現(xiàn)中重新包含指定的文件或宏 |
| -d {name}={file} | 如果宏{name}出現(xiàn)在include包含行中,使用{file}替代 |
| -i {dir} | 在處理include包含時(shí),可以在指定的{dir}目錄中搜索文件 |
| -v | 輸出詳細(xì)信息 |
轉(zhuǎn)載于:https://www.cnblogs.com/oloroso/p/9121728.html
總結(jié)
以上是生活随笔為你收集整理的使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iPhone 12什么时候开启预购什么时
- 下一篇: C++并发编程实战---阅读笔记