Search
Search
#1. 使用gcc 自製C/C++ 靜態、共享與動態載入函式庫教學 - GT Wang
靜態函式庫 (static library)就是由一些物件檔案(object files)所構成的封裝檔,通常其檔案名稱都會以 lib 開頭,而副檔名則為 .a 。 使用靜態連結函式 ...
在電腦科學中,靜態庫(英語:Static library, Statically-linked library),或稱靜態函式庫,是一個外部函式與變數的集合體。靜態函式庫的檔案內容,通常包含 ...
#3. Linux動態&靜態函式庫解說@ 研究所學習筆記 - 隨意窩
Linux動態&靜態函式庫解說動態連結程式庫(Shared library)是在程式開始執行時才載入的,其優點在於(1)減少執行檔的大小,(2)更新程式庫而無需重新編譯其他程式, ...
GCC 是一套強大的C/C++語言編譯器,它可以產生靜態程式庫與動態程式庫,接下來就來看看這兩種程式庫有何種差別與如何產生。 靜態程式庫靜態程式庫的 ...
#5. [C 語言] 程式設計教學:撰寫跨平台C 專案 - 技術文件
由於靜態函式庫和動態函式庫的目的檔相異,兩者無法同時編譯,要先編完其中 ... Windows 上有兩套C 編譯器,分別是Visual C++ (MSVC) 和MinGW (GCC)。
#6. Linux C 靜態庫(.a) 與動態庫(.so) 的詳解- IT閱讀
動態函式庫的改變並不影響你的程式,所以動態函式庫的升級/更新比較方便。 二、靜態庫. (一)簡單介紹 /opt/hisi-linux/x86-arm/gcc-3.4.3 ...
關於Static Library ,應該大多程式設計者都很熟悉,就是將自定的函式寫再不同的.c ... gcc -g -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc.
gcc –o sharedcode -L. –lshared main.c(預設庫在當前資料夾). 當程式與靜態庫連線時,庫中目標檔案所含的所有將被程式使用的函式的機器碼被copy到 ...
2、程式函式庫可分為3種類型:靜態函式庫(static libraries)、共享函式 ... 第一步gcc xxx.c -c 生成xxx.o檔案 a、 gcc calcufuncs.c -c //第二步ar ...
#10. 靜態函式庫.a 共享與動態函式庫.so - 阿就操場啊~
使用GCC編譯原始碼產生可執行檔(executable),連結部分要選擇做靜態函式庫(Static library或static-linked library)與動態連結函式庫(Dynamic ...
#11. 由GCC了解C語言,學習筆記 - iT 邦幫忙
使用 -c 參數表示gcc不會鏈接函式庫,但會對每一個輸入的檔案產生目的碼,也就是.o檔。 ... 靜態函式庫(Static library)是在程式變為執行檔時便載入完成,具有三個優點.
#12. [Linux] Static Library和Dynamic Library編譯 - 菜園角耕耘田地
然後在編譯使用到ezxml函式庫的程式時,要把靜態函式庫包進來,把ezxml_mycode.c檔案編譯成ezxml_mycode_static檔。 gcc ezxml_mycode.c libezxml.a -o ...
#13. 107.08.25 C 語言static 和shared 函式庫 - 記錄用
static library shared library. ... <注意>實驗中所使用的gcc 在Cygwin 下為Cygwin 內部的gcc,若要使windows 可以直接執行,應改用 ...
#14. quick note — [linux] 用gcc編出靜態函式庫 - 雅虎電話面試
[linux] 用gcc編出靜態函式庫來源: http://blog.yam.com/ytha/article/16636287 這個部份並不是很困難, 小弟就以自己所知的用非常"白話"的方式來說, ...
#15. [轉載]Makefile教學(一) - 卡油裡
一般在Linux下用gcc編譯C語言程式, 預設的情況編譯器只會搜尋標準的吸久久(C99)函式庫, 諸如stdio.h, math.h等等, 而標準的Linux系統函式通常存放在/lib 和/usr/lib, ...
#16. 靜態函數庫
在電腦科學中,靜態庫(英語:Static library, Statically-linked library), ... GCC. 靜態函數庫檔名為 lib*.a ,在使用了其中的函數之後,使用 -l* 參數要求連接器 ...
#17. 編譯器參數
C/C++編譯器常用參數. gcc; 函式庫(library). Static libraries; shared libraries; 找不到shared library的處理方式; Dynamically loaded libraries. include ...
#18. static library 靜態函式庫
誠徵觀落陰工程師###### tags: `MVMC-lab` `python` `C4MLIB` `Book` - [為何會有這份教材](/T5x0Wy1mTwusyCZnAtRGNA)
#19. Linux 的.a / .so / .la 函式庫的差異
.o (obj file) 是目標物件函式庫, 等同於Windows 的.obj .a 為靜態函式庫, 可以是一個或多個.o 合在一起, ... gcc -Wall -fpic -shared test1.c test2.c -o libtest.so.
#20. 阿偉蘇的程式記事本- Logdown
2.2 使用. 與使用static library 同。 $ gcc main.c libmylib.so. 以上直接指定與libmylib.so 連結。 或用. $ gcc main.c -L. -lmylib.
#21. 淺談函式庫
比較shared/static library程式在執行的時候,大部分都會需要引用函式庫(library) ... gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0.0 ...
#22. 以GNU程式開發工具建構函式庫 - 計中首頁
以函式庫的方式共享程式碼,是Linux作業系統、嵌入式系統、與自由及開放 ... 使用GNU編譯器套件(GCC) 把全部的程式碼編譯成目標檔,再用靜態函式庫 ...
#23. Linux庫概念,動態庫和靜態庫的製作,如何移植第三方庫
gcc -c -I /home/xxxx/include test.c //假設test.c要使用對應的靜態庫 ... Linux系統下,DL函式庫與其他函式庫在格式上沒有特殊的區別,它們建立的 ...
#24. 一、靜態庫和動態庫,Makefile專案管理 - IT人
1. gcc add.c sub.c mul.c -c ——>得到*.o 2. ar rs libmymath.a add.o sub.o mul.o ——>得到 ... 缺點:相較於靜態庫函式呼叫速度略慢(延遲繫結機制).
#25. Compile Static Library | 夢想家
最後更新: 2020-02-24. 目錄. Check Static / Dynamic linking; GCC; nm; Flag; randomize_va_space; Openssl; Static Linking Flag ...
#26. 標頭檔函式庫與gcc
gcc 怎麼知道去哪裡找foo.c裡面所include的header檔,連結資料庫 與系統定義呢? 總共有下列來源指定gcc去那找。 當初在編譯時指定的(在~gcc/gcc/collect2.c:locatelib().
#27. linux靜態庫和動態庫的區別 - w3c學習教程
linux靜態庫和動態庫的區別,1 生成方式add c main c add h 靜態庫gcc c add ... 利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被 ...
#28. gcc中靜態鏈接庫和動態鏈接庫- docs01
These examples were tested and run on cygwin/Windows. The code for the library. This is the code that goes into the library. It exhibits one single function ...
#29. Makefile重要筆記 - 史坦利Stanley程式Maker的部落格
gcc main.c foo.c clean.c -I /usr/foo/include -lpthread -L /usr/foo/lib -O3 ... 靜態、共享與動態鏈結函式庫我們已經知道:輪子不必重複發明-- 人家寫好的方法我們 ...
#30. Linux靜態庫和動態庫 - 程序員學院
利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標**中,它的優點就顯而易見了,即編譯後 ... 靜態庫的操作工具:gcc和ar.
#31. Go with Cgo 靜態連結(static linking) 函式庫建置範例與筆記
提示:Linux 測試環境go version go1.10.1 linux/amd64 & gcc version 6.3.1 ... 修改原先的專案檔,改成建置為靜態函式庫(static library) 。
#32. 第二十一章、軟體安裝:原始碼與Tarball - 鳥哥的Linux 私房菜
函式庫又分為動態與靜態函式庫,這兩個咚咚的分別我們在後面的小節再加以說明。 ... 事實上,使用類似gcc 的編譯器來進行編譯的過程並不簡單,因為一套軟體並不會僅 ...
#33. 如何在C/C++程式語言中使用Rust的函式庫? | MagicLen
在先前的文章中,本站有介紹過在Rust程式語言中使用C/C++的函式庫的方式, ... 以上指令會使用 gcc 來編譯 hello_world.c ,並且會去連結靜態函式庫 ...
#34. static link & Dynamic Link & Load - 日常瑣碎事- 痞客邦
Creating a Static Library: Compile source codes # gcc –c file1.c file2.c file3.c. Create a static library named libmylib.a
#35. Makefile範例教學| Jason note
.a檔是一個靜態函式(static library),關於靜態跟共享的觀念稍候解釋。 再來更多吧!假設你今天要編譯main這隻程式,他的source codes有main.c, foo.
#36. Linking a static library with gcc on Centos7 not working - Stack ...
I was able to compile using the following command: gcc -g -Wall -Wl,-no-undefined -fPIC -I/my-project-dir /my-project-dir/Native.c -o ...
#37. IDE Atmel Studio 7專案新增函式庫Project Property - RO-BOY
新增函式庫的來源有三種,第一種是來自編譯器提供者(本課程為GCC),即Toolchain Library,第二種是來自於同一個專案的自建函式庫Project Library, ...
#38. GCC 的使用
GCC 是由GNU 出的C 語言編譯器,可將由ANSI C 或traditional C 語言寫. 成的程式碼編譯成可執行檔。由於GCC 能分別編譯出可執行於許多不同硬體、 ... 實作-靜態函式庫.
#39. 靜態連結庫和動態連結庫 - w3c菜鳥教程
obj檔案是一種介於源**和最終生成檔案的中間**。通常一個程式(例如exe檔案)由多個源**組成,或者依賴其他函式庫(lib、dll等檔案),單個obj檔案不具有 ...
#40. gcc object - 軟體兄弟
靜態函式庫 (static library)就是由一些物件檔案(object files)所構成的 ..., gcc file.c -c. outputs me this file.o. how to run above command so it outputs me ...
#41. [C++] 如何用gcc 編出library 讓其他人使用-- DLL
Makefile 簡單規則你可以參考Ref[2], 這份文件內容專注於如何建立static library 與share library. 文章內容. 1. 如何建立static link 的程式庫.
#42. linux中的動態連結庫和靜態連結庫是幹什麼的? - 劇多
在這裡先介紹下Linux下的gcc編譯的幾個選項會將hellospeak.cpp 選項-c 用來告訴編譯器編譯原始碼 ... l 靜態庫對函式庫的連結是放在編譯時期完成的。
#43. gcc/g++ 連結庫的編譯與連結 - 每日頭條
linux下使用ar工具(windows下用lib.exe)(具體的用法參考【5】),可以將目標文件壓縮到一起,並且對其進行編號和索引,一便於查找和索引。一般創建靜態 ...
#44. 《程式語言》
靜態函式庫 可以是一般的C 語言檔案,如svm.c,在gcc 中可以如下編譯: gcc -c -o svm.o svm.c. 2.靜態函式庫通常為lib 開頭,.a 結尾的檔案,需透過ar 指令產生:.
#45. 如何編出動態函式庫(.so) 和靜態函式庫(.a ... - Terry's Blogger
如何編出動態函式庫(.so) 和靜態函式庫(.a) 以及如何在編譯程式時使用他們 ... arm-linux-gcc audio_aiff.c audio_esd.c audio_null.c audio_oss.c ...
#46. [心得] 用gcc 自製Library - 看板LinuxDev - 批踢踢實業坊
Static libraries Static 程式庫用於靜態連結,簡單講是把一堆object檔 ... Creating a shared and static library with the gnu compiler [gcc] ...
#47. CMake 函式庫連結 - Geekbbon極客幫
靜態函式庫 (.lib .a) : 使用ar指令進行編譯; 動態函式庫(.dll .so): 使用fpic指令進行編譯; 物件(.obj .o): 用gcc將source code編譯成物件.
#48. gcc小實作Library – static、shared與dynamically loaded - 易春木
與使用static library 同。 [user@host ~]$ gcc main.c libmylib.so. 以上直接指定與libmylib.so 連結。 或用. [user@ ...
#49. 解決Linux 上C/C++ 的undefined symbol 或undefined reference
沒有的話,用dpkg -L X-dev | grep include 找出header 位置。若是另外下載的程式碼,在裡面找找header 也沒什麼困難。 要注意的是static library 和…
#50. gcc編譯連結靜態庫動態庫
先寫一下實現乘除功能的子函式,其餘同上。 // filename multi_div.h. #ifndef __multi_div_h__. #define __multi_div_h__. int multi(int ...
#51. 【Linux】靜態庫和動態庫的生成與使用 - 有解無憂
生成可執行程式鏈接動態庫時,是將動態庫中的函式資訊表記錄到可執行程式中,生成的可執行程式較小,運行時要加載動態庫,不會造成代碼冗余,在gcc ...
#52. HOWTO: Add a static library file into S32DS GCC project
This document describes two ways how to add a static library file (*.a) into your S32 Design Studio GCC project. These methods differs from ...
#53. œÐ°Ý°ò¥»Æ[©À°ÝÃD
此外若有靜態和動態兩個函式庫同時存在,這時程式是要使用靜態函式庫還是動態函式庫?? 除了靜態函式庫 ... It is normally called by your compiler(for example gcc).
#54. Create and link your own C Static Library using plain GCC or ...
#55. 靜態/ 動態函式庫 - 冷靜
編譯行為:整個函式庫的資料被整合到執行檔中,所以利用編譯成的檔案會比較大。 ... ar crv libtest.a a.o b.o 產生libtest.a的靜態函式庫
#56. 如何鏈接到C中的靜態庫? - How to link to a static library in C?
I use code::blocks to compile my static library. The output result is a libstatic.a ... 一些關於鏈接到靜態庫的例子,例如。 gcc -I. -o jvct jvct.c libjvc.a ...
#57. gcc中靜態鏈接庫和動態鏈接庫 - 台部落
Here's a summary on how to create a shared and a static library with gcc. The goal is to show the basic steps. I do not want to go into the ...
#58. Beginning Linux Programming 學習筆記(1) - Library 簡介
shell> gcc -c fred.c bill.c ; gcc -o program program.c bill.o # (1) 將定義兩個function 的檔案編譯成object file # (2) 產生static library ...
#59. GNU 的連結工具(ld, nm, objdump, ar)_rheostat的专栏 - CSDN ...
接著,您就可以像連結靜態函式庫一樣,在gcc 中使用-l<libname> 的方式,連結動態函式庫了,例如,下列程式就會將test.c 檔與libabc.so 函式庫,連結 ...
#60. Linux 的.a / .so / .la 函式庫的差異
.o (obj file) 是目標物件函式庫, 等同於Windows 的.obj .a 為靜態函 ... libtool --mode=link gcc -o libmylib.la -rpath /usr/lib –L/usr/lib –la ...
#61. [Linux 教學] Makefile 教學(一) - 程式扎記
而靜態函式庫是可以獨立存在, 但是不能共用的,常應用於嵌入式系統, 而動態函式庫是不 ... john:~/test1/mkfile # gcc -c main.c <產生main.o的目的檔>
#62. C++ 17 Inline Variable | 羅根學習筆記
因為編譯C++ 函式庫通常必需處理很瑣碎的細節,所以一些函式庫作者傾向將整個實作都放 ... 以 inline 關鍵字修飾的靜態資料成員能在「類別定義(Class ...
#63. Creating a shared and static library with the gnu compiler (gcc)
Here's a summary on how to create a shared and a static library with gcc. The goal is to show the basic steps. I do not want to go into the ...
#64. Compilation of gcc in Linux, making of static library and ...
Compilation, static library, dynamic library of gcc in Linux Article directory: 1 gcc compilation process. 1.1 The compilation process of gcc; 1.2 Common ...
#65. GCC generates static library. a and dynamic library. so
lib under Windows,. a under Linux and Mac). It is called static because the static library will be copied directly to the target program when ...
#66. Glibc 2 HOWTO 中文版: 安裝成主要函式庫
任何你編譯的新程式都將會連結到這一個函式庫, 除非你用了特殊的編譯選項來連結到其它的版本 ... 約150 MB 的磁碟空間; GNU make 3.75; gcc >= 2.7.2 (最好是2.7.2.1) ...
#67. 解決undefined symbol / reference - fcamel 技術隨手記
事實上, 在編譯單一檔案時, gcc/g++ 根本不在意真正的symbol 是否存在, ... 在用readelf -Ws 讀static library 時, 會列出各個object file 的內容。
#68. How to create and link a static library for an ARM project using ...
a from mylib.c/.h and link it to a project to use this library in bootloader code using the arm-none-eabi-gcc cross compiler in ubuntu ...
#69. GNU indirect function 的運作機制 - Ernie's Blog
編譯器GCC 提供了函式屬性(function attribute) ifunc 來指定目標函式的解析器。新的程式碼如下,我們會把它編譯成函式庫 ifunc_method.so :
#70. GNU C 函式庫常見問題(FAQ) - 蘋果小豬筆記
我需要什麼工具來建立GNU libc 呢? 您會需要:. GCC, C 與C++ 編譯器都要[供testsuite 用途]. GNU binutils.
#71. 把玩CMake 的第一步- Drake's Weblog
把原來的Hello World 改寫一下,寫一個hello() (檔名就叫hello_lib.c)的函式,然後產生一個靜態函式庫(static library)(在Linux 下,副檔名是.a), ...
#72. Static 與Shared 的函式庫撰寫 - Fred's blog
文章一開始就提到函式庫分兩種類型:Static Library、Shared Library。 ... gcc -g -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0 ...
#73. 靜態連結和動態連結的區別 - 壹讀
靜態 連結把要調用的庫函數直接連結到目標程序。成為可執行文件的一部分。換句話說,要調用的庫函數在程序的exe文件中,該文件包含了運行時所需的全部 ...
#74. linux底下用C語言建立static library
使用ar工具打包 static lib靜態,檔名使用lib開頭且已.a結尾,當編譯使用-l旗標的時候反而把lib拿掉比方說檔案名稱libpthread.a,編譯的時候gcc ...
#75. Introduction of GCC Compiler - World @ 翼、想、天、開
$SACLIB:是一個路徑變數名稱,必須被指定正確的值。執行這個命令前必須先確定這個變數是有被指派到正確路徑才行。.a 檔是一個靜態函式(static library), ...
#76. Linux 函式庫(Library) - Picasso's Fantasy Notepad
另一種則是動態函式庫(或稱為共享函式庫),附檔名為*.so (shared object),相當於Windows下的*.dll (Dynamic-Link Libraries)。 靜態函式庫的缺點是,當 ...
#77. 跨函式庫進行記憶體配置與釋放需考慮Runtime 連結方式
當主程式與函式庫分別都與Runtime 做靜態連結時, Heap 會是各自擁有, ... gcc -o libtestlib.so -fpic -shared testlib.c // 動態 gcc -o ...
#78. GNU 的連結工具(ld, nm, objdump, ar) - 陳鍾誠的網站
接著,您就可以像連結靜態函式庫一樣,在gcc 中使用-l<libname> 的方式,連結動態函式庫了,例如,下列程式就會將test.c 檔與libabc.so 函式庫,連結 ...
#79. Linux下動態庫和靜態庫的製作及使用 - ITW01
利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目的碼中,他的優點就 ... gcc -o main main.c -L./ -lpr //生成main.
#80. gcc编译工具生成动态库和静态库之一----介绍 - 博客园
"意思是当前路径. 3.编译成够后执行./main,会提示:. In function `main':; main.c:( ...
#81. [C/C++] 3-1 建立.a函式庫來使用- 以Orwell Dev C++為例
gcc -c 檔名.c (這條指令會將你的.c檔編成.o檔). ar -r 函庫的名稱.a 剛剛產生的.o (這邊會將你的.o包成.a檔, 當然可以包含多個.o).
#82. 使用gcc生成静态库和动态库- SegmentFault 思否
静态 库可以看作一堆的目标文件的集合,可能包含了很多函数的实现。在 linux 最常用的C语言静态库 libc 位于 /usr/lib/libc.a ,它由成百上千个C语言 ...
#83. Making of static library and dynamic library - 文章整合
When static libraries are used, they are directly introduced into gcc As raw materials in compilation, you can generate executable files for .
#84. [達人專欄] DLL 檔案到底是什麼?淺談動態連結函式庫
你可以把它理解成是程式的片段,就是一個已經編譯好的工具箱,隨時等著你去取用,這就是dll 檔案的作用。 當然,有動態函式庫,就會有與之相對的靜態函式 ...
#85. 具有默认功能的Windows静态库 - 技术问答
我想在Windows中创建一个静态库(.lib),可以在后续构建中使用的Windows中作为未定义功能的“备份”。 例如,假设我有foobar.lib,它有定义:
#86. Cmake set version. Therefore, I would go for CMake 3. cmake ...
sudo update-alternatives --install /usr/bin/gcc gcc One may now set ... things: Call cargo build -release to build the static library and the necessary c ...
#87. Keil vs gcc
LinkIt SDK GCC, IAR Embedded Workbench, and Keil uVision IDE (Get Started Guide) ... If you link with a static library, its code is copied into the a.
#88. Make cmake. . Using a C++ library, particularly a 3rd party one ...
Education Details: I am building a static library in CMake, ... Win32 ports of GCC, GDB, binutils to build native Win32 programs that rely on no 3rd party ...
#89. Llvm debugger. Environment variables for LLVM's OpenMP ...
Like GCC, LLVM is a C/C++ compiler toolset. ... Name Description Default; shared-llvm: link against llvm shared rather than static library.
#90. 使用gcc 建置Boost 時開啟c++11 的功能
Heresy 在2010 年開始使用Boost C++ Libraries(官網)的時候,已經有寫過一篇《Boost C++ Libraries 簡介》,大致介紹過這套半C++ 官方的函式庫 ...
#91. Assembly language gcc. asm benchmark array copy speed ...
[CMake] Assembly language support using gcc or gas Glenn Coombs glenn. ... Creating a Static Library with Assembly. js Ocaml Octave Objective-C Oracle ...
#92. Jboolean jni. 1开始,Java Native Interface (JNI)标准成为java ...
第一步:新建工具类Car,写一个本地静态方法getCarName ()。 ... jni::GetBooleanField() and jni::GetBoolField()). h 標準函式庫,而NDK 本身的資料型態也跟Java 略為 ...
#93. 初尝angr静态分析 - 安全客
用gcc编译后,用下面的angr脚本先画个CFG图看看。 import angr from angrutils import * proj = angr.Project("testcase/call",load_options={ ...
#94. Make error 2. Make sure you configured right preferred DNS ...
Centos下gcc的安装、gcc的更新、gcc安装过程中报错:make[1]: ... make -j4 I get the following error: [ 74%] Linking CXX static library libplayer_chain_action.
#95. Quickjs vs nodejs. It even automatically loads any modules ...
0) tdm64-gcc-10. ... Includes GCC C/C++, GNU binutils, mingw32-make, GDB (64-bit), ... To create a static library project in Visual Studio. js works.
#96. Makefile error 124. 0 (GCC) The gfortran team I have ...
0 (GCC) The gfortran team I have rearranged the EXTRA_LIBRARIES section of the ... configure | 9 -----> tests/vm/Makefile. mak 编译静态库: nmake -f ms\nt.
#97. A Practical Guide to UNIX for Mac OS X Users
For example, the gcc compiler might keep its libraries in ... With a static library, you need to relink every program that uses the library once the library ...
#98. Clang m1 mac. This page contains known issues and ...
GCC :GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言 ... inputs--emit-static-lib¶ Enable linker job to emit a static library.
gcc 靜態函式庫 在 [心得] 用gcc 自製Library - 看板LinuxDev - 批踢踢實業坊 的美食出口停車場
Library可分成三種,static、shared與dynamically loaded。
1. Static libraries
Static 程式庫用於靜態連結,簡單講是把一堆object檔用ar(archiver)
包裝集合起來,檔名以 `.a' 結尾。優點是執行效能通常會比後兩者快,
而且因為是靜態連結,所以不易發生執行時找不到library或版本錯置而
無法執行的問題。缺點則是檔案較大,維護度較低;例如library如果發
現bug需要更新,那麼就必須重新連結執行檔。
1.1 編譯
編譯方式很簡單,先例用 `-c' 編出 object 檔,再用 ar 包起來即可。
____ hello.c ____
#include <stdio.h>
void hello(){ printf("Hello "); }
____ world.c ____
#include <stdio.h>
void world(){ printf("world."); }
____ mylib.h ____
void hello();
void world();
$ gcc -c hello.c world.c /* 編出 hello.o 與 world.o */
$ ar rcs libmylib.a hello.o world.o /* 包成 limylib.a */
這樣就可以建出一個檔名為 libmylib.a 的檔。輸出的檔名其實沒有硬性規定,
但如果想要配合 gcc 的 '-l' 參數來連結,一定要以 `lib' 開頭,中間是你要
的library名稱,然後緊接著 `.a' 結尾。
1.2 使用
____ main.c ____
#include "mylib.h"
int main() {
hello();
world();
}
使用上就像與一般的 object 檔連結沒有差別。
$ gcc main.c libmylib.a
也可以配合 gcc 的 `-l' 參數使用
$ gcc main.c -L. -lmylib
`-Ldir' 參數用來指定要搜尋程式庫的目錄,`.' 表示搜尋現在所在的目錄。
通常預設會搜 /usr/lib 或 /lib 等目錄。
`-llibrary' 參數用來指定要連結的程式庫 ,'mylib' 表示要與mylib進行連結
,他會搜尋library名稱前加`lib'後接`.a'的檔案來連結。
$ ./a.out
Hello world.
2. Shared libraries
Shared library 會在程式執行起始時才被自動載入。因為程式庫與執行檔
是分離的,所以維護彈性較好。有兩點要注意,shared library是在程式起始
時就要被載入,而不是執行中用到才載入,而且在連結階段需要有該程式庫
才能進行連結。
首先有一些名詞要弄懂,soname、real name與linker name。
soname 用來表示是一個特定 library 的名稱,像是 libmylib.so.1 。
前面以 `lib' 開頭,接著是該 library 的名稱,然後是 `.so' ,接著
是版號,用來表名他的介面;如果介面改變時,就會增加版號來維護相容度。
real name 是實際放有library程式的檔案名稱,後面會再加上 minor 版號與
release 版號,像是 libmylib.so.1.0.0 。
一般來說,版號的改變規則是(印象中在 APress-Difinitive Guide to GCC中有
提到,但目前手邊沒這本書),最尾碼的release版號用於程式內容的修正,
介面完全沒有改變。中間的minor用於有新增加介面,但相舊介面沒改變,所以
與舊版本相容。最前面的version版號用於原介面有移除或改變,與舊版不相容
時。
linker name是用於連結時的名稱,是不含版號的 soname ,如: libmylib.so。
通常 linker name與 real name是用 ln 指到對應的 real name ,用來提供
彈性與維護性。
2.1 編譯
shared library的製作過程較複雜。
$ gcc -c -fPIC hello.c world.c
編譯時要加上 -fPIC 用來產生 position-independent code。也可以用 -fpic
參數。 (不太清楚差異,只知道 -fPIC 較通用於不同平台,但產生的code較大
,而且編譯速度較慢)。
$ gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0.0 \
hello.o world.o
-shared 表示要編譯成 shared library
-Wl 用於參遞參數給linker,因此-soname與libmylib.so.1會被傳給linker處理。
-soname用來指名 soname 為 limylib.so.1
library會被輸出成libmylib.so.1.0.0 (也就是real name)
若不指定 soname 的話,在編譯結連後的執行檔會以連時的library檔名為
soname,並載入他。否則是載入soname指定的library檔案。
可以利用 objdump 來看 library 的 soname。
$ objdump -p libmylib.so | grep SONAME
SONAME libmylib.so.1
若不指名-soname參數的話,則library不會有這個欄位資料。
在編譯後再用 ln 來建立 soname 與 linker name 兩個檔案。
$ ln -s libmylib.so.1.0.0 libmylib.so
$ ln -s libmylib.so.1.0.0 libmylib.so.1
2.2 使用
與使用 static library 同。
$ gcc main.c libmylib.so
以上直接指定與 libmylib.so 連結。
或用
$ gcc main.c -L. -lmylib
linker會搜尋 libmylib.so 來進行連結。
如果目錄下同時有static與shared library的話,會以shared為主。
使用 -static 參數可以避免使用shared連結。
$ gcc main.c -static -L. -lmylib
此時可以用 ldd 看編譯出的執行檔與shared程式庫的相依性
$ldd a.out
linux-gate.so.1 => (0xffffe000)
libmylib.so.1 => not found
libc.so.6 => /lib/libc.so.6 (0xb7dd6000)
/lib/ld-linux.so.2 (0xb7f07000)
輸出結果顯示出該執行檔需要 libmylib.so.1 這個shared library。
會顯示 not found 因為沒指定該library所在的目錄,所找不到該library。
因為編譯時有指定-soname參數為 libmylib.so.1 的關係,所以該執行檔會
載入libmylib.so.1。否則以libmylib.so連結,執行檔則會變成要求載入
libmylib.so
$ ./a.out
./a.out: error while loading shared libraries: libmylib.so.1:
cannot open shared object file: No such file or directory
因為找不到 libmylib.so.1 所以無法執行程式。
有幾個方式可以處理。
a. 把 libmylib.so.1 安裝到系統的library目錄,如/usr/lib下
b. 設定 /etc/ld.so.conf ,加入一個新的library搜尋目錄,並執行ldconfig
更新快取
c. 設定 LD_LIBRARY_PATH 環境變數來搜尋library
這個例子是加入目前的目錄來搜尋要載作的library
$ LD_LIBRARY_PATH=. ./a.out
Hello world.
3. Dynamically loaded libraries
Dynamicaaly loaded libraries 才是像 windows 所用的 DLL ,在使用到
時才載入,編譯連結時不需要相關的library。動態載入庫常被用於像plug-ins
的應用。
3.1 使用方式
動態載入是透過一套 dl function來處理。
#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
開啟載入 filename 指定的 library。
void *dlsym(void *handle, const char *symbol);
取得 symbol 指定的symbol name在library被載入的記憶體位址。
int dlclose(void *handle);
關閉dlopen開啟的handle。
char *dlerror(void);
傳回最近所發生的錯誤訊息。
____ dltest.c ____
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main() {
void *handle;
void (*f)();
char *error;
/* 開啟之前所撰寫的 libmylib.so 程式庫 */
handle = dlopen("./libmylib.so", RTLD_LAZY);
if( !handle ) {
fputs( dlerror(), stderr);
exit(1);
}
/* 取得 hello function 的 address */
f = dlsym(handle, "hello");
if(( error=dlerror())!=NULL) {
fputs(error, stderr);
exit(1);
}
/* 呼叫該 function */
f();
dlclose(handle);
}
編譯時要加上 -ldl 參數來與 dl library 連結
$ gcc dltest.c -ldl
結果會印出 Hello 字串
$ ./a.out
Hello
關於dl的詳細內容請參閱 man dlopen
--
參考資料:
Creating a shared and static library with the gnu compiler [gcc]
https://www.adp-gmbh.ch/cpp/gcc/create_lib.html
Program Library HOWTO
https://tldp.org/HOWTO/Program-Library-HOWTO/index.html
APress - Definitive Guide to GCC
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.139.148.148
... <看更多>