automake學(xué)習(xí)筆記 - 安裝與發(fā)布

系列文章:
automake學(xué)習(xí)筆記 - helloworld
automake學(xué)習(xí)筆記 - 模塊化編譯
automake學(xué)習(xí)筆記 - 安裝與發(fā)布
automake學(xué)習(xí)筆記 - 交叉編譯

辛辛苦苦寫(xiě)出來(lái)的代碼當(dāng)然是需要發(fā)布出來(lái)給自己或者別人去使用的。這篇文章就談一談發(fā)布相關(guān)的東西吧。

安裝

軟件在編譯完后就需要進(jìn)行安裝刨摩。configure生成的Makefile支持install志衣。使用make install 命令就可以將編譯出來(lái)的軟件安裝到系統(tǒng)中玛臂。

如果沒(méi)有做配置秕硝,默認(rèn)會(huì)安裝到/usr/local中,當(dāng)然如果需要的話也可以使用configure的--prefix參數(shù)指定安裝的路徑,如在build中執(zhí)行下面的命令就可以將build目錄指定為安裝目錄:

../configure --prefix=`pwd`

之后再執(zhí)行下面的安裝命令,工程在編譯完后就會(huì)安裝到build目錄下池充。安裝完畢之后可以看到build里面多了bin和lib兩個(gè)目錄

make install

bin目錄下是編譯出來(lái)的可執(zhí)行文件example,而lib目錄下就是編譯出來(lái)的依賴庫(kù):

-rw-r--r-- 1 linjw linjw 263K 3月  22 13:44 libeasylog.a
-rwxr-xr-x 1 linjw linjw  985 3月  22 13:44 libeasylog.la
lrwxrwxrwx 1 linjw linjw   19 3月  22 13:44 libeasylog.so -> libeasylog.so.0.0.0
lrwxrwxrwx 1 linjw linjw   19 3月  22 13:44 libeasylog.so.0 -> libeasylog.so.0.0.0
-rwxr-xr-x 1 linjw linjw 143K 3月  22 13:44 libeasylog.so.0.0.0

編譯出來(lái)的libeasylog.so.0.0.0就可以直接拿出去給其他人使用了

卸載

卸載的話很簡(jiǎn)單,只需要執(zhí)行下面的命令就行了

make uninstall

當(dāng)然你也可以選擇手動(dòng)去將安裝的文件一個(gè)個(gè)刪除,但是這樣既麻煩又容易漏刪或者錯(cuò)刪

libtool 庫(kù)版本號(hào)系統(tǒng)

我們可以看到編譯出來(lái)的so庫(kù)是帶版本號(hào)的旋膳,默認(rèn)0.0.0,當(dāng)然我們也能直接忽略版本號(hào)(某些可動(dòng)態(tài)加載的的插件模塊可能不需要版本號(hào)):

lib_LTLIBRARIES = libeasylog.la

libeasylog_la_SOURCES = cout_log_interface.cpp \
                     easy_log.cpp 

libeasylog_la_LDFLAGS = -avoid-version

這樣生成安裝的so庫(kù)就不會(huì)帶版本號(hào)了:

-rw-r--r-- 1 linjw linjw 263K 3月  26 11:27 libeasylog.a
-rwxr-xr-x 1 linjw linjw  975 3月  26 11:27 libeasylog.la
-rwxr-xr-x 1 linjw linjw 143K 3月  26 11:27 libeasylog.so

當(dāng)然,絕大部分的庫(kù)都是需要帶上版本號(hào)的途事。每個(gè)系統(tǒng)的庫(kù)版本機(jī)制都不一樣,libtool通過(guò)一種抽象的版本機(jī)制最終在創(chuàng)建庫(kù)的時(shí)候才映射到具體的系統(tǒng)版本機(jī)制上验懊。這是為了方便在交叉編譯的時(shí)候可以用一種機(jī)制去管理不同平臺(tái)上的各種版本機(jī)制。

libtool 庫(kù)版本號(hào)系統(tǒng)有下面三個(gè)部分:

  • current

接口的修改次數(shù)

  • revision

上次修改后源碼的修改次數(shù)(注意這里指的是只改動(dòng)了實(shí)現(xiàn),沒(méi)有修改接口,如果改了接口的話應(yīng)該要改current號(hào)尸变,并且把revision置零)

  • age

當(dāng)前版本可以向前兼容的版本數(shù)

官方文檔是這么描述這三個(gè)部分的更新規(guī)則的:

Here are a set of rules to help you update your library version information:

  1. Start with version information of ‘0:0:0’ for each libtool library.
  2. Update the version information only immediately before a public release of your software. More frequent updates are unnecessary, and only guarantee that the current interface number gets larger faster.
  3. If the library source code has changed at all since the last update, then increment revision (‘c:r:a’ becomes ‘c:r+1:a’).
  4. If any interfaces have been added, removed, or changed since the last update, increment current, and set revision to 0.
  5. If any interfaces have been added since the last public release, then increment age.
  6. If any interfaces have been removed or changed since the last public release, then set age to 0.

翻譯過(guò)來(lái)就是

  1. 庫(kù)版本號(hào)應(yīng)該開(kāi)始于0.0.0
  2. 只有在正式發(fā)布庫(kù)的時(shí)候才更新版本號(hào)以避免版本號(hào)增長(zhǎng)過(guò)快
  3. 當(dāng)實(shí)現(xiàn)代碼改變的時(shí)候revision加1
  4. 當(dāng)接口改變(無(wú)論是添加义图,刪除還是修改接口聲明)的時(shí)候current加1,同時(shí)revision重置為0
  5. 如果庫(kù)只是增加了接口,則age加1
  6. 如果庫(kù)刪除或者修改了接口聲明,則age重置為0

這三個(gè)值可以用-version-info指定

-version-info current[:revision[:age]]

revision 和 age都可以省略,例如你這樣設(shè)置:

lib_LTLIBRARIES = libeasylog.la

libeasylog_la_SOURCES = cout_log_interface.cpp \
                     easy_log.cpp 

libeasylog_la_LDFLAGS = -version-info 3:12:1

表明接口被修改了三次,第三次修改接口之后又修改了12次源碼,接口可以向前兼容1個(gè)版本

make install 后可以看到lib目錄下生成的庫(kù)長(zhǎng)這樣:

-rw-r--r-- 1 linjw linjw 263K 3月  26 12:11 libeasylog.a
-rwxr-xr-x 1 linjw linjw  987 3月  26 12:11 libeasylog.la
lrwxrwxrwx 1 linjw linjw   20 3月  26 12:11 libeasylog.so -> libeasylog.so.2.1.12
lrwxrwxrwx 1 linjw linjw   20 3月  26 12:11 libeasylog.so.2 -> libeasylog.so.2.1.12
-rwxr-xr-x 1 linjw linjw 143K 3月  26 12:11 libeasylog.so.2.1.12

為啥是libeasylog.so.2.1.12而不是libeasylog.so.3.12.1呢?

原來(lái)這幾個(gè)數(shù)字是這樣計(jì)算的:

庫(kù)名.so.current-age.age.revision

這樣會(huì)引發(fā)一個(gè)問(wèn)題:

假設(shè)你的庫(kù)有兩個(gè)【3:0:1】【4:0:2】召烂。 再假設(shè)在你編譯程序的機(jī)器上安裝了最新的【4:0:2】歌溉, 且你在程序中使用了該版本中新加的接口。當(dāng)你程序編譯好后骑晶, 你ldd發(fā)現(xiàn)你的程序依賴libraryname.so.2痛垛, 同時(shí)你將程序安裝在了只安裝了【3:0:1】的機(jī)器上, 你會(huì)發(fā)現(xiàn)你的程序能搜索到動(dòng)態(tài)庫(kù)桶蛔, 卻在運(yùn)行的時(shí)候發(fā)現(xiàn)未定義的符號(hào)匙头, 因?yàn)椤?:0:1】中沒(méi)有新添加的接口。 故你需要在運(yùn)行機(jī)器上保證安裝了同一主版本號(hào)最新的library仔雷, 以保證你的程序能正確運(yùn)行蹂析。

libtool動(dòng)態(tài)庫(kù)版本系統(tǒng)之個(gè)人理解 這篇博客引用

手動(dòng)指定版本號(hào)

我之前了解到的so的命名規(guī)范其實(shí)和libtool的版本號(hào)系統(tǒng)的so庫(kù)命名規(guī)范不一樣:

庫(kù)名.so.主版本號(hào).次版本號(hào).發(fā)布版本號(hào)

官方文檔也有提到這一點(diǎn):

Often, people want to encode the name of the package release into the shared library so that it is obvious to the user what package their programs are linked against. This convention is used especially on GNU/Linux:

trick$ ls /usr/lib/libbfd*
/usr/lib/libbfd.a /usr/lib/libbfd.so.2.7.0.2
/usr/lib/libbfd.so
trick$

On ‘trick’, /usr/lib/libbfd.so is a symbolic link to libbfd.so.2.7.0.2, which was distributed as a part of ‘binutils-2.7.0.2’.

Unfortunately, this convention conflicts directly with libtool’s idea of library interface versions, because the library interface rarely changes at the same time that the release number does, and the library suffix is never the same across all platforms.

So, to accommodate both views, you can use the -release flag to set release information for libraries for which you do not want to use -version-info. For the libbfd example, the next release that uses libtool should be built with ‘-release 2.9.0’, which will produce the following files on GNU/Linux:

trick$ ls /usr/lib/libbfd*
/usr/lib/libbfd-2.9.0.so /usr/lib/libbfd.a
/usr/lib/libbfd.so
trick$

In this case, /usr/lib/libbfd.so is a symbolic link to libbfd-2.9.0.so. This makes it obvious that the user is dealing with ‘binutils-2.9.0’, without compromising libtool’s idea of interface versions.

Note that this option causes a modification of the library name, so do not use it unless you want to break binary compatibility with any past library releases. In general, you should only use -release for package-internal libraries or for ones whose interfaces change very frequently.

可以使用-release去手動(dòng)指定版本號(hào),雖然官方不推薦用這種方式:

lib_LTLIBRARIES = libeasylog.la

libeasylog_la_SOURCES = cout_log_interface.cpp \
                     easy_log.cpp 

libeasylog_la_LDFLAGS = -release 0.0.3

安裝之后lib目錄如下:

-rwxr-xr-x 1 linjw linjw 143K 3月  26 14:48 libeasylog-0.0.3.so
-rw-r--r-- 1 linjw linjw 263K 3月  26 14:48 libeasylog.a
-rwxr-xr-x 1 linjw linjw  993 3月  26 14:48 libeasylog.la
lrwxrwxrwx 1 linjw linjw   19 3月  26 14:48 libeasylog.so -> libeasylog-0.0.3.so

可以在這里查看完整的項(xiàng)目代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碟婆,隨后出現(xiàn)的幾起案子电抚,更是在濱河造成了極大的恐慌,老刑警劉巖竖共,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝙叛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡公给,警方通過(guò)查閱死者的電腦和手機(jī)借帘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)蜘渣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肺然,你說(shuō)我怎么就攤上這事蔫缸。” “怎么了际起?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵拾碌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我街望,道長(zhǎng)倦沧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任它匕,我火速辦了婚禮展融,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豫柬。我一直安慰自己告希,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布烧给。 她就那樣靜靜地躺著燕偶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪础嫡。 梳的紋絲不亂的頭發(fā)上指么,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音榴鼎,去河邊找鬼伯诬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巫财,可吹牛的內(nèi)容都是我干的盗似。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼平项,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赫舒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闽瓢,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤接癌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后扣讼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缺猛,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枯夜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弯汰。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艰山,死狀恐怖湖雹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曙搬,我是刑警寧澤摔吏,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站纵装,受9級(jí)特大地震影響征讲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橡娄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一诗箍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挽唉,春花似錦滤祖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至塑顺,卻和暖如春汤求,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背严拒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工扬绪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裤唠。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓勒奇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親巧骚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赊颠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容