日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件

發(fā)布時(shí)間:2023/12/2 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(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,然后編譯生成即可。
最后的示例下載中有我編譯的程序。

# 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中的幾個(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)。
源碼如下:

#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"

一個(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)行下面命令生成合并后的頭文件

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

執(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ō)明

參數(shù)解釋
-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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。