使用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,然后編譯生成即可。
最后的示例下載中有我編譯的程序。
具體的使用可以參考程序的幫助信息。
將libuv合并為單一頭文件和源文件版本(Windows下)
用于合并的模板文件編寫可以參考https://github.com/vinniefalco/Amalgams.git中的幾個。
以libuv為例進行簡單的說明。
先下載libuv的源碼,目錄結構如下:
首先先合并頭文件
先編寫一個頭文件uv_all.h,里面把libuv-v1.9.1\include下的文件都include進來。
源碼如下:
一個簡單的做法就是cygwin或msys下使用命令ls *.h |xargs -I{} echo '#include "{}"'直接輸出。
因為我這里只做windows平臺的,所以把多余的都給刪除了。
實際上因為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 | 輸出詳細信息 |
轉載于:https://www.cnblogs.com/oloroso/p/9121728.html
總結
以上是生活随笔為你收集整理的使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone 12什么时候开启预购什么时
- 下一篇: 儿童电子手表怎么设置(儿童电子手表怎样调