<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            C語言

            C語言鏈接庫的用法

            時間:2025-05-25 00:03:42 C語言 我要投稿

            C語言鏈接庫的用法

              庫文件簡單了說就是包含了別人(或者自己)已經寫好的代碼,可以直接調用的其內部函數的文件。庫文件又包含動態庫文件和靜態庫文件。為什么有靜態庫和動態庫的區別,我簡單的介紹一下我所理解的什么是靜態庫,什么又是動態庫。下面是小編為大家帶來的C語言鏈接庫的用法,歡迎閱讀。

              0x01 鏈接庫的簡單理解與編譯命令

              庫文件簡單了說就是包含了別人(或者自己)已經寫好的代碼,可以直接調用的其內部函數的文件。庫文件又包含動態庫文件和靜態庫文件。為什么有靜態庫和動態庫的區別,我簡單的介紹一下我所理解的什么是靜態庫,什么又是動態庫。

              靜態庫

              Linux系統下后綴名為*.a

              Windows系統下后綴名為*.lib

              調用靜態庫,在編譯器進行編譯過程中,在有需要調用到庫文件內部函數的地方,編譯器會將靜態庫里的函數實現過程,拷貝到函數調用的地方。在編譯好的程序運行時,不需要依賴庫文件,可以獨立運行。庫文件對代碼復用性很高,容易理解也容易使用,對提高開發速率有很大幫助,不需要自己造輪子。

              Linux下生成靜態庫文件命令

              $ gcc -c [FileName].c // 生成*.o文件

              $ ar -crv [FileName].a [FileName].o // 生成*.a文件

              動態庫

              Linux系統下文件名格式為lib*.so

              Windows系統下后綴名*.dll

              上面介紹了靜態庫在編譯過程中,編譯器會將函數實現拷貝到可執行文件中,所以在程序運行時會占用一定的資源,造成資源浪費,而且在庫文件的版本更新中,一點微小的改動,就需要對整個程序進行重新編譯發布,在使用者使用過程中,這是得不償失的。而動態庫,則改進了靜態庫的這些缺點。簡單介紹兩個方面:

              1、靜態庫在編譯過程中不需要將代碼編譯到可執行程序中,在程序運行時需要調用的時候才加載。解決了在開發程序中使用靜態庫版本更新的問題,使用動態庫不需要將自己編寫的程序重新編譯,更新庫和更新程序是獨立的兩項任務。

              2、可以實現庫共享,不同程序的相同功能代碼的實現可以只需要一份庫文件提供調用,比如jpeg圖像編碼功能,很多程序都需要進行圖像處理,簡單的Logo頭像的顯示到復雜的平面設計,不同的軟件可能使用的都是同一份庫文件。

              雖然動態庫相對靜態庫優化了很多缺點,但并不是說可以完全不需要靜態庫。在內部開發的時候,兩個同事對同一個項目的不同子功能進行開發,這些功能具有相互聯系,但是又不希望對外部人員提供引用,在程序發布時,打包編譯所有的代碼實現都編譯到程序中。

              Linux下編譯生成動態庫文件

              $ gcc -fPIC -c [FileName].c

              $ gcc -shared -o lib[FileName].so [FileName].o

              也可以一條命令編譯

              gcc -fPIC -shared [FileName].c -o lib[Name].so

              0x02 庫的編程使用

              我主要使用簡單的編程實例介紹動態庫的使用,靜態庫的使用方法與之相同。

              我所舉的例子中編寫了3份文件

              1、libtest.c // 庫函數實現,最終將此文件編譯成庫文件

              2、test.h // 測試頭文件,文件內只有一個結構體變量

              3、main.c // 測試代碼主函數的實現

              ps: test.h頭文件中只提供了一個結構體,庫文件并不提供新的變量類型引用,新的變量一定需要定義

              直接呈上代碼

              test.h:

              /** test.h **/

              #ifndef TEST_H

              #define TEST_H

              typedef struct {

              int a;

              char b;

              }Test_t;

              #endif

              libtest.c:

              /** libtest.c **/

              #include

              #include

              #include "./test.h"

              int fun1(int a)

              {

              return a*2;

              }

              Test_t *fun2(Test_t a)

              {

              a.a++;

              a.b = 's';

              Test_t *b = malloc(sizeof(Test_t));

              *b = a;

              return b;

              }

              很簡單的內容,兩個函數,fun1()和fun2()

              先編譯庫文件 libtest.so

              $ gcc -fpic -shared libtest.c -o libtest.so

              main.c:

              /** main.c **/

              #include

              #include

              #include "./test.h"

              int main()

              {

              //struct TEST_T A;

              Test_t A;

              A.a = 10;

              A.b = 'w';

              printf("[init] Test.a = %d ", A.a);

              printf("[init] Test.b = %c ", A.b);

              printf(" ");

              printf("[call] fun1() = %d ", fun1(A.a));

              printf(" ");

              Test_t *B;

              B = (Test_t *)fun2(A); // 加強制轉換

              printf("[call] fun2().a = %d ", B->a);

              printf("[call] fun2().b = %c ", B->b);

              printf(" ");

              free(B);

              }

              編譯主程序

              $ gcc main.c -L./ -ltest -I./ -o main

              0x03 測試&結果

              wangsansan@ubuntu$ ./main

              [init] Test.a = 10 [init] Test.b = w

              [call] fun_test() = 20

              [call] fun2_test().a = 11

              [call] fun2_test().b = s

              wangsansan@ubunut$


            【C語言鏈接庫的用法】相關文章:

            C語言鏈接庫的用法簡記07-21

            c語言鏈表的用法10-20

            c語言strcmp的用法10-26

            c語言if語句的用法07-23

            assert用法(C語言)05-30

            C語言#include用法10-17

            C語言#define的用法08-19

            C語言assert的用法10-29

            C語言指針的用法07-02

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院