當前位置:首頁 » 編程軟體 » 靜態庫編譯makefile

靜態庫編譯makefile

發布時間: 2022-02-27 06:12:35

A. makefile 生成動態庫和靜態庫的區別

生成動態庫的時候要注意,編譯生成目標文件的時候加上-fPIC參數,生成位置無關的可重定位代碼,然後鏈接的時候加上-shared生成動態共享庫。比如一個hello.c,生成靜態庫:

gcc-ohello.o-chello.c
arrcslibhello.ahello.o

生成動態庫的命令:

gcc-fPIChello.o-chello.c
gcc-shared-olibhelllo.sohello.o

還有一個區別是:靜態庫參與鏈接過程,而動態庫不鏈接到可執行文件中,可執行程序在運行的時候,對應的動態庫也要載入到內存中,否則可執行程序運行不了。

更多詳細細節,可以網路搜索視頻教程:Makefile工程實踐

B. 我寫了個Makefile文件 指定調用我自己編譯的靜態庫 怎麼每次系統都從/usr/lib下面查找

你在makefile中指定所鏈接庫的位置了么??
在你的makefile中寫編譯規則的地方加上 -L/home/zhangcl/lib 就好了

C. 如何將第三方靜態庫加入Makefile.am中

將庫和對應的頭文件放到指定目錄,然後編譯的時候,指定這個庫路徑,鏈接使用這個庫即可。

D. 請教Makefile中依賴自已寫的靜態庫問題

靜態庫後出現一大堆的鏈接錯誤 選中剛添加的table, 然後在菜單中選擇Editor\Embed In\Navigation Controller。 同時選中table view和table view controller, 將Attributes Inspector中的content type修改為Static Cells(如下圖所示)。

E. makefile 交叉編譯怎麼引用靜態庫

看你的mysql當前默認的存儲引擎:
mysql>
show
variables
like
'%storage_engine%';
你要看某個表用了什麼引擎(在顯示結果里參數engine後面的就表示該表當前用的存儲引擎):
mysql>
show
create
table
表名;

F. 多級目錄makefile,靜態庫

在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 proce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello,1.0, [[email protected]])
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 proce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello,1.0, [[email protected]])
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 動態庫搜索路徑,運行生成的可執行文件。

G. 怎麼編寫Makefile生成靜態庫

編寫Makefile生成靜態庫的方法:
方法一
//////////////////////////////////////////////////////////////////
divFIX=/usr
LIBDIR=$(divFIX)/lib
INCLUDEDIR=$(divFIX)/include
#$(DESTDIR) is usally empty. rpmbuild needs it.
DESTDIR=
CC=gcc
CFLAGS=
LIBS=
INCLUDES=
AR=ar
all: hello.a
hello.a: file1.o file2.o
$(AR) -r $@ $^
file1.o: file1.c
$(CC) $(CFLAGS) -c $^ -o $@ $(LIBS) $(INCLUDES)
file2.o: file2.c
$(CC) $(CFLAGS) -c $^ -o $@ $(LIBS) $(INCLUDES)
install:
@echo Copying library files to $(DESTDIR)/$(LIBDIR):
@cp -rp libthreadpool.a $(DESTDIR)/$(LIBDIR)/
@echo Copying head files to $(DESTDIR)/$(DATADIR):
@cp -rp src/thread-pool.h $(DESTDIR)/$(INCLUDEDIR)/
clean:
rm -rf *.o \
*.a
uninstall:
rm -rf $(LIBDIR)/hello.a\
$(INCLUDEDIR)/hello.h
//////////////////////////////////////////////////////////////////////////

方法二
gcc -o hellofile.a file1.o file2.o -lc -lm -shared

動態庫
gcc -o hellofile.so file1.o file2.o -lc -lm -shared
# -lpthread 線程
# -shared 共享庫
# -lm 表示連接名為「libm.a」的數學函數庫
# -lc 代表鏈接器將連接GCC的標准C庫
# -o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
# -g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。
# .a為後綴的文件,是由目標文件構成的檔案庫文件;
# .so 為動態庫。

H. makefile如何鏈接靜態庫

makefile 裡面寫法,同你的編譯器 如何鏈接靜態庫的方法有關。例如:指定庫名
VC++ 用 編譯選項 /MT 鏈接 LIBCMT.LIB 就是 鏈接靜態庫。
-----
unix/linux makefile 裡面,例如
LIBS = libmine.a -lpthread 這里寫你要鏈接的靜態庫庫名

CXXFILES = pthreads.cpp 程序名字們
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine 編譯選項
LIBS = libmine.a -lpthread 庫名
all:

$(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)
clean:

rm -f prog *.o

I. Linux 下Makefile怎麼寫,編譯包含 一個共享庫文件,一個靜態庫文件,四個.c文件。

看看偉東山裸機的源代碼就能知道了, 調用的庫文件只需放在同一目錄下就可以

J. Linux2.6 如何編寫Makefile,使驅動程序能夠編譯鏈接靜態庫

就我的感覺,靜態庫是編譯好的.o文件,你只要將靜態庫(mylib.a)放置於 /lib 以及/usr/lib 文件夾下,然後在gcc編譯器的變數中 加上 -lmylib,就可以了。

熱點內容
網路設置里沒有伺服器是什麼 發布:2025-01-18 09:52:19 瀏覽:343
阿里雲esc伺服器系統 發布:2025-01-18 09:49:16 瀏覽:790
你們家的無線網密碼是多少 發布:2025-01-18 09:47:50 瀏覽:730
renderscriptandroid 發布:2025-01-18 09:32:18 瀏覽:993
安卓手機如何拍游戲素材 發布:2025-01-18 09:30:59 瀏覽:348
廣州日立壓縮機有限公司 發布:2025-01-18 09:15:08 瀏覽:624
伺服器兩條寬頻如何疊加網速 發布:2025-01-18 08:52:17 瀏覽:731
oracle存儲過程集合 發布:2025-01-18 08:42:39 瀏覽:885
洋蔥數學緩存 發布:2025-01-18 08:38:36 瀏覽:919
電影的文件夾都是 發布:2025-01-18 08:21:49 瀏覽:835