青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

isware

使用Automake 創建和使用靜態庫/動態庫

1. 目錄結構如下:
example
|——src 目錄(存放源代碼文件)
        |——hello.c
|——lib 目錄(存放用來生成庫的文件)
        |——test.c 用來生成靜態庫libhello.a
|——include 目錄(存放程序中使用的頭文件)
        |——hello.h
2. 編寫的各個目錄下的源文件
hello.h 文件
extern void print(char *);
test.c 文件
#include<stdio.h>
void print(char *msg)
{
print(“%s\n”, msg);
}
hello.c 文件
#include “hello.h”
int main()
{
print(“Hello static library!”);//這里用到的是靜態庫中的函數
return 0;
}
3. 編寫lib/Makefile.am 文件
noinst_LIBRARIES=libhello.a
libhello_a_SOURCES=test.c
AUTOMAKE_OPTIONS=foreign
第一行noinst 表示生成的是靜態庫,不需要make install ,直接制定它的位置和名字就
可以使用。
第二行表示用來生成靜態庫的源文件。如果要把靜態庫生成到其他地方,可以在=后面
加上路徑(建議用絕對路徑,并將所要用到的靜態庫生成在同一個文件夾下,如lib)。
第三行AUTOMAKE_OPTIONS 是Automake 的選項。Automake 主要是幫助開發 GNU 軟
件的人員來維護軟件,所以在執行Automake 時,會檢查目錄下是否存在標準 GNU 軟件中
應具備的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。設置為foreign 時,Automake
會改用一般軟件的標準來檢查。如果不加這句的話,需要在autoconf之前,先執行touch NEWS
README AUTHORS ChangeLog 來生成'NEWS'、'AUTHOR'、 'ChangeLog' 等文件
4. 編寫src/Makefile.am 文件
AUTOMAKE_OPTIONS=foreign
INCLUDES= -I../include
bin_PROGRAMS=hello
hello_SOURCES=hello.c
hello_LDADD=../lib/libhello.a
第二行指定頭文件的位置,-I 是idirafter 的縮寫。../include 指定頭文件的位置,..是上
一級目錄,也就是這里的example 目錄。
第三行指定生成可執行文件名hello,在這里可執行文件生成在src 下,建議將可執行文
件生成到一個特定的文件夾下,讓它和源代碼分開,如/root/test 目錄下。寫法為:
bin_PROGRAMS=/root/test/hello,后面的第四、五行也相對應地變為:
_root_test_hello_SOURCES=hello.c
_root_test_hello_LDADD=../lib/libhello.a
第四行指定生成可執行文件hello 的源代碼文件,如果hello.c 在其他目錄下,需要加上
完整的路徑。
第五行指定需要使用靜態庫的位置。
5. 生成靜態庫文件lib/libhello.a。
執行autoscan 生成configure.scan 文件,將它重命名為configure.in 并修改其內容。
#configure.in
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(libhello.a,1.1,[])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
AC_PROG_RANLIB//需要加入的內容,因為使用了靜態庫
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile])
AC_INIT(FILE)
該宏用來檢查源代碼所在路徑,autoscan 會自動產生,一般無須修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION)
這個是使用 Automake 所必備的宏,PACKAGE 是所要產生軟件的名稱,VERSION 是版
本編號。也可以把包和版本號等信息放在AC_INIT(FILE) 宏里。
AC_PROG_CC
檢查系統可用的C 編譯器,若源代碼是用C 寫的就需要這個宏。
AC_OUTPUT(FILE)
設置 configure 所要產生的文件,若是Makefile ,configure 便會把它檢查出來的結果
填充到Makefile.in 文件后產生合適的 Makefile。 后面的FILE 是一個Makefile 的輸出列表,
你可以選著將要輸出的Makefile 的位置和個數。建議只在src 中輸出Makefile。
在lib 目錄下依次執行 aclocal 、autoconf、automake --add-missing、./configure、make,
此時在該目錄下就可以看到生成的靜態庫文件libhello.a
6. 在src 目錄下,執行autoscan 生成configure.scan 文件,將它重命名為configure.in 并修
改其內容。
#configure.in
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello,1.1,[])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.c])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile])
7. 在src 目錄下依次執行 aclocal 、autoconf、automake --add-missing、./configure、make,
生成可執行文件hello
8. 執行make install 進行安裝,最后輸入hello 來運行程序,查看效果:
Hello static library!
執行成功!
使用gcc 創建和使用靜態庫
1. 編寫mylib.h 文件
#ifndef _mylib_h_
#define _mylib_h_
void welcome();
void outstring(const char * str);
#endif
2. 編寫mylib.c 文件,用來生成靜態庫。
#include <stdio.h>
void welcome()
{
printf(“welcome to libmylib\n”);
}
void outstring(const char * str)
{
if(str!=NULL)
printf(“%s”,str);
}
3. 編譯源文件,產生目標代碼
gcc –o mylib.o –c mylib.c
4. 將上面產生的目標文件加入到靜態庫中,并把靜態庫拷貝到系統默認的路徑
ar rcs libmylib.a mylib.o
cp libmylib.a /usr/lib/
5. 編寫測試程序來使用剛才創建的靜態庫 libmylib.a
#include “mylib.h”
#include <stdio.h>
Int main()
{
printf(“create and use library:\n”);
welcome();
outstring(“It’s a successful\n”);
}
6. 編譯使用庫函數的程序
gcc –o test test.c -lmylib
運行./test 查看結果。


使用Automake 創建和使用動態庫


動態庫與靜態庫的差別在于:動態庫是在程序執行的時候加載到內存,供調用函數使用。
1. 目錄結構如下:
example
|——src 目錄(存放源代碼文件)
|——hello.c
|——lib 目錄(存放用來生成庫的文件)
|——test.c 用來生成動態庫libhello.la
|——include 目錄(存放程序中使用的頭文件)
|——hello.h
2. 編寫各個目錄下的源文件如下:
hello.h 文件
extern void print(char *);
test.c 文件
#include<stdio.h>
void print(char *msg)
{
print(“%s\n”, msg);
}
hello.c 文件
#include “hello.h”
int main()
{
print(“Hello static library!”);//這里用到的是動態庫中的函數
return 0;
}
3. 在lib 目錄下編譯需要生成動態庫的文件,生成動態庫,并安裝到系統的標準庫中,供
程序調用。具體步驟如下:
(1) 編寫Makefile.am 文件
AUTOMAKE_OPTIONS=foreign
lib_LTLIBRARIES=libhello.la
libhello_la_SOURCES=test.c
這里lib_LTLIBRARIES 的意思是生成的動態庫,然后指定動態庫依賴的源文件
test.c ,若有多個源文件用空格隔開。
(2) 在lib 目錄下,用命令autoscan 產生configure.scan 文件,并改名為configure.in。 這
里需加上宏AC_PROG_LIBTOOL,表示利用libtool 來自動生成動態庫
#configure.in
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello,1.0, [miaoquan@nou.com.cn])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([test.c])
#AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_PROG_LIBTOOL
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
(3) 執行命令aclocal、libtoolize -f -c 、autoconf、automake --add-missing、./configure、
make、make install 將動態庫安裝到系統的標準庫中,以供調用(一般為/usr/local/lib)。
注:libtoolize 提供了一種標準的方式來將libtool 支持加入一個軟件包,而GNU libtool 是
一個通用庫支持腳本,將使用動態庫的復雜性隱藏在統一、可移植的接口中。
4. 生成src 目錄下的hello 可執行文件
(1) 編寫src/Makefile.am 文件
AUTOMAKE_OPTIONS=foreign
INCLUDES= -I../include
bin_PROGRAMS=hello
hello_SOURCES=hello.c
hello_LDADD=-lhello
-ldir 指定編譯時搜索庫的路徑。與靜態庫不同的是,創建動態庫時不用指定庫路
徑,編譯器自動在標準庫中查找libhello.so 文件。
(2) 執行autoscan 生成configure.scan 文件,將它重命名為configure.in 并修改其內容。
# configure.in
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello,1.0, [miaoquan@nou.com.cn])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.c])
#AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
(3) 在src 目錄下編譯并生成目標文件,執行命令aclocal、libtoolize -f -c 、autoconf、
automake --add-missing、./configure、make,此時你一定會覺得,成功近在咫尺了。再
執行目標文件./hello,結果卻在你的意料之外:
./hello: error while loading shared libraries: libhello.so.0 : cannot open shared object file:
No such file or directory
在執行目標文件的時候,Shell 找不到共享庫的位置,需要我們手工載入庫路徑。
5. shell 搜索動態庫路徑位置的兩種方法
(1) 使用命令導入動態庫的路徑,命令如下:
export LD_LIBRARY_PATH=dir (如/usr/local/lib)
(2) 修改/etc/ld.so.conf 文件,加入搜索路徑,修改后用ldconfig 命令載入修改。
將自己可能存放庫文件的路徑都加入到/etc/ld.so.conf 中是明智的選擇 ^_^。添加
方法也極其簡單,將庫文件的絕對路徑直接寫進去就OK 了,一行一個。例如:
/usr/local/lib
/usr/lib
/lib
需要注意的是:這種搜索路徑的設置方式對于程序連接時的庫(包括共享庫和靜態
庫)的定位已經足夠了,但是對于使用了共享庫的程序的執行還是不夠的。這是 因為
為了加快程序執行時對共享庫的定位速度,避免使用搜索路徑查找共享庫的低效率,所
以是直接讀取庫列表文件 /etc/ld.so.cache 從中進行搜索的。/etc/ld.so.cache 是一個非
文本的數據文件,不能直接編輯,它是根據 /etc/ld.so.conf 中設置的搜索路徑由
/sbin/ldconfig 命令將這些搜索路徑下的共享庫文件集中在一起而生成的(ldconfig 命令
要以 root 權限執行)。因此,為了保證程序執行時對庫的定位,在 /etc/ld.so.conf 中
進行了庫搜索路徑的設置之后,還必須要運行 /sbin/ldconfig 命令更新 /etc/ld.so.cache
文件之后才可以。ldconfig ,簡單的說,它的作用就是將/etc/ld.so.conf 列出的路徑下的庫
文件 緩存到/etc/ld.so.cache 以供使用。因此當安裝完一些庫文件,(例如剛安裝好glib),
或者修改ld.so.conf 增加新的庫路徑后,需要運行一下/sbin/ldconfig 使所有的庫文件都
被緩存到ld.so.cache 中,如果沒做,即使庫文件明明就在/usr/lib 下的,也是不會被使
用的,結果編譯過程中報錯,缺少xxx 庫,去查看發現明明就在那放著,搞的想大罵
computer 蠢豬一個^_^。極力推薦使用這種方法!
利用gcc 創建和使用動態庫
1. 用下面的命令將mylib.c 程序創建成一個動態庫:
gcc –fPIC –o mylib.o –c mylib.c
gcc –shared –o libtt.so mylib.o
-fPIC 作用于編譯階段,告訴編譯器產生與位置無關代碼(Position-Independent Code),
則產生的代碼中,沒有絕對地址,全部使用相對地址,故而代碼可以被加載器加載到內存的
任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被加載時,在內存的位置不
是固定的。
-shared 作用于鏈接階段,實際傳遞給鏈接器ld,讓其添加作為共享庫所需要的額外描
述信息,去除共享庫所不需的信息。
也可以直接使用下面一條命令:
gcc –fPIC –shared –o libtt.so mylib.c
2. 將動態庫拷貝到linux 的標準庫中,usr/local/lib 或者/usr/lib 或者/lib:
cp libttt.so /usr/local/lib
3. 編譯src 目錄下的源程序時,指定動態庫文件的目錄,調用動態庫中的函數
gcc –o test test.c /usr/lib/libttt.so
4. 設置shell 動態庫搜索路徑,運行生成的可執行文件。
---------------------------------------------------------------------------

AUTOMAKE_OPTIONS=foreign

INCLUDES=-I$(top_srcdir)/libpr/include -I$(top_srcdir)/vt/include

noinst_PROGRAMS =libvt.so
libvt_so_SOURCES=vty/vtcmd.c vty/vtdrv.c vty/vty.c vty/evtd.c telnet/telcmd.c telnet/teldrv.c telnet/telnegot.c telnet/telsvr.c telnet/telsess.c vty/defcmd.c vty/vtobj.c
libvt_so_LDFLAGS = -fPIC -shared
libvt_so_LDADD=$(top_srcdir)/libpr/libpr.a

bin_PROGRAMS = test_telnetd
test_telnetd_SOURCES = test/test_telnetd.c 
test_telnetd_LDADD=$(top_srcdir)/libpr/libpr.a libvt.so

上面這段代碼是從我的一個工程的Makefile.am中摘抄過來的,使用不少技巧。

1、動態庫實際上也是ELF格式,所以我們使用PROGRAMS宏,automake將他按執行文件規格設置環境,如果使用noinstall_LIBRARIES那么就變成*.a靜態庫了。

2、因為是動態庫,所以我們有必要加入-fPIC -shared

3、test_telnetd需要調用libvt.so,所以他們之間存在依賴關系。我們將libvt.so直接添加在LDADD 中,automake會自動他們建立依賴關系,在Makefile中可以到test_telnetd_DEPENDENCIES,里面包含 libvt.so。

這里有幾個要緊需要注意:

1、$(bin_PROGRAMS)編譯順序在$(noinstall_PROGRAMS)之前,因為test_telnetd需要libvt.so,所以會找不到libvt.so。

2、在LDADD中如果使用-lvt不會建立依賴關系,如果使用$(top_srcdir)/vt/libvt.so也不行。

3、實際上如果不行的話,我們可以直接使用test_telnetd_DEPENDENCIES來指定libvt.so

4、如果需要make install 安裝libvt.so到lib,那么使用XXX_PROGRAMS=...的方法,然后指定XXXbin=...就行了。類似于bin_PROGRAMS。

這里使用到的技巧都很有用,值得記錄下來。

posted on 2011-06-01 13:22 艾斯維亞 閱讀(5661) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区三区播放老司机| 久久成人免费网| 亚洲日本中文字幕免费在线不卡| 久久久久久伊人| 亚洲第一视频网站| 欧美激情一区在线观看| 欧美高清视频一二三区| 一本色道久久综合亚洲二区三区 | 亚洲精品一区二区三| 快射av在线播放一区| 欧美伊人久久| 国产一区二区三区av电影| 欧美中文字幕精品| 亚洲综合首页| 国产视频一区在线| 久久九九免费视频| 久久一二三区| 亚洲精品一区中文| aa日韩免费精品视频一| 欧美性猛交99久久久久99按摩 | 蜜臀av在线播放一区二区三区| 激情懂色av一区av二区av| 久久精品视频在线免费观看| 欧美在线关看| 黄色一区三区| 亚洲国产aⅴ天堂久久| 欧美国产1区2区| 亚洲深夜av| 欧美一区二区三区免费大片| 国产精品久久网| 一本久久综合| 最新日韩欧美| 国产精品99免费看 | 久久精品国产在热久久| 伊人成综合网伊人222| 亚洲第一中文字幕在线观看| 欧美美女福利视频| 欧美一级电影久久| 久久久国产视频91| 99精品视频网| 欧美一区影院| 日韩一级二级三级| 性欧美video另类hd性玩具| 亚洲电影在线| 一区二区三区国产精品| 国产精品高潮久久| 久久影视三级福利片| 欧美 亚欧 日韩视频在线| 久久久97精品| 欧美女主播在线| 久久视频在线免费观看| 欧美日韩精品一区二区天天拍小说| 久久国产加勒比精品无码| 欧美激情第二页| 久久久久久久久久久一区| 欧美日韩精品一二三区| 麻豆91精品| 国产精品永久免费视频| 91久久久久久国产精品| 国产在线精品成人一区二区三区 | 99精品免费视频| 欧美在线视频在线播放完整版免费观看 | 亚洲一区二区三区在线视频| 亚洲一区二区三区四区视频| 激情久久婷婷| 日韩性生活视频| 国内久久精品| 亚洲午夜一区二区三区| 亚洲国产精品小视频| 亚洲免费中文| 99国产精品99久久久久久| 欧美亚洲网站| 亚洲一区亚洲| 国产精品免费小视频| 亚洲免费福利视频| 99视频+国产日韩欧美| 久久―日本道色综合久久| 一区二区三区日韩精品视频| 欧美freesex8一10精品| 欧美在线观看视频一区二区| 国产精品区二区三区日本 | 一区二区av在线| 欧美a级一区二区| 欧美成人精品不卡视频在线观看| 狠狠88综合久久久久综合网| 性色av一区二区怡红| 欧美在线一二三| 国产麻豆视频精品| 欧美一区二区三区久久精品茉莉花| 亚洲欧美一区二区激情| 国产精品久久久91| 亚洲一区二区三区精品动漫| 欧美一区1区三区3区公司| 欧美日韩伊人| 亚洲欧美日韩精品一区二区| 久久国产精品72免费观看| 黑人巨大精品欧美黑白配亚洲| 欧美一级大片在线免费观看| 久久久综合免费视频| 激情av一区| 欧美激情中文不卡| 亚洲三级国产| 先锋资源久久| 精品动漫3d一区二区三区免费 | 久久精品二区三区| 韩国一区二区在线观看| 久久久激情视频| 亚洲第一视频| 亚洲欧美日韩国产成人| 国产日韩欧美自拍| 久久久久国产免费免费| 亚洲国内高清视频| 亚洲欧美日本国产专区一区| 国产日本欧美在线观看 | 在线一区二区三区四区五区| 欧美日韩1区2区3区| 亚洲一区国产| 欧美va亚洲va香蕉在线| 一区二区av在线| 国产欧美日韩激情| 男人的天堂成人在线| 亚洲视频免费看| 欧美大片免费| 午夜精品久久久久| 亚洲国产专区校园欧美| 国产精品av免费在线观看| 久久精品99国产精品日本 | 欧美一区二区三区免费在线看 | 久久精品免费| 亚洲精选中文字幕| 久久嫩草精品久久久久| 日韩亚洲国产欧美| 好吊妞**欧美| 欧美午夜精品久久久久久人妖| 欧美一区二区精美| 夜夜嗨av一区二区三区免费区| 久久性色av| 欧美亚洲一区二区在线观看| 亚洲区第一页| 激情欧美一区二区| 国产精品亚洲视频| 欧美精品www| 久久久精彩视频| 一本久道久久综合狠狠爱| 蜜臀av国产精品久久久久| 亚欧成人精品| 亚洲午夜精品一区二区| 亚洲精品欧美激情| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲日本久久| 国产视频亚洲精品| 欧美3dxxxxhd| 欧美在线观看视频一区二区三区| 一区二区三区视频观看| 日韩一级免费观看| 91久久国产综合久久| 久久久综合精品| 久久久久国产精品麻豆ai换脸| 亚洲一区制服诱惑| 亚洲午夜电影在线观看| 亚洲深夜福利视频| 一区二区三区免费在线观看| 亚洲精品偷拍| 亚洲理论电影网| 一区二区三区www| 亚洲人成网站777色婷婷| 在线观看三级视频欧美| 在线观看91精品国产入口| 韩国精品一区二区三区| 激情视频一区二区| 1024欧美极品| 亚洲欧洲久久| 夜夜嗨av一区二区三区网站四季av| 亚洲日韩欧美视频一区| 日韩视频国产视频| 亚洲一区二区精品| 午夜精品免费在线| 久久精品噜噜噜成人av农村| 久久精品一二三区| 免费不卡在线观看av| 亚洲国产高清aⅴ视频| 亚洲精品一区二区三区不| 亚洲麻豆一区| 亚洲欧美区自拍先锋| 久久精品夜色噜噜亚洲aⅴ| 久久久久久自在自线| 欧美精品一区二区蜜臀亚洲| 欧美日韩中文字幕日韩欧美| 国产精品久久久久久久久动漫| 国产女精品视频网站免费| 激情国产一区| 亚洲黄色成人| 一本色道久久| 欧美gay视频激情| 亚洲一区欧美激情| 欧美精品福利| 在线日本高清免费不卡| 欧美一区二区福利在线| 亚洲精品欧美极品| 久久久久久伊人|