首頁>Program>source

我有一个問题:如何在Linux中使用gcc編譯靜態庫,即我需要將源代碼編譯成名為out.a的檔案.只需使用命令 gcc -o out.a out.c編譯就足够了 ? 我對gcc不太熟悉,希望任何人都可以帮忙。

最新回復
  • 5月前
    1 #

    請參阅使用gnu編譯器[gcc]

    建立共享的靜態庫。
    gcc -c -o out.o out.c
    

    -c 意味着建立一个中間目標檔案,而不是可執行檔案。

    ar rcs libout.a out.o
    

    這將建立靜態庫. r 意味着要插入替換, c 意味着建立一个新的档案,然後 s 表示編寫索引.与往常一樣,請參见手册頁以获取更多資訊。

  • 5月前
    2 #

    這裏有完整的makefile示例:

    makefile

    TARGET = prog
    $(TARGET): main.o lib.a
        gcc $^ -o [email protected]
    main.o: main.c
        gcc -c $< -o [email protected]
    lib.a: lib1.o lib2.o
        ar rcs [email protected] $^
    lib1.o: lib1.c lib1.h
        gcc -c -o [email protected] $<
    lib2.o: lib2.c lib2.h
        gcc -c -o [email protected] $<
    clean:
        rm -f *.o *.a $(TARGET)
    

    解釋生成檔案:

      target: prerequisites -規則頭

      [email protected] -表示目標

      $^ -表示所有先決條件

      $< -只是第一个前提條件

      ar -用於建立,修改和从档案中提取的Linux工具,請參见手册頁以获取更多資訊.在這種情况下,這些選項表示:

        r -替換存档中現有的檔案

        c -如果尚不存在,請建立一个存档

        s -在归档檔案中建立目標檔案索引

        To conclude :Linux下的靜態庫只不過是目標檔案的存档。

        main.c 使用lib

        #include <stdio.h>
        #include "lib.h"
        int main ( void )
        {
            fun1(10);
            fun2(10);
            return 0;
        }
        

        lib.h libs主標题

        #ifndef LIB_H_INCLUDED
        #define LIB_H_INCLUDED
        #include "lib1.h"
        #include "lib2.h"
        #endif
        

        lib1.c 第一个lib来源

        #include "lib1.h"
        #include <stdio.h>
        void fun1 ( int x )
        {
            printf("%i\n",x);
        }
        

        lib1.h 相應的標頭

        #ifndef LIB1_H_INCLUDED
        #define LIB1_H_INCLUDED
        #ifdef __cplusplus
           extern “C” {
        #endif
        void fun1 ( int x );
        #ifdef __cplusplus
           }
        #endif
        #endif /* LIB1_H_INCLUDED */
        

        lib2.c 第二个lib来源

        #include "lib2.h"
        #include <stdio.h>
        void fun2 ( int x )
        {
            printf("%i\n",2*x);
        }
        

        lib2.h 相應的標頭

        #ifndef LIB2_H_INCLUDED
        #define LIB2_H_INCLUDED
        #ifdef __cplusplus
           extern “C” {
        #endif
        void fun2 ( int x );
        #ifdef __cplusplus
           }
        #endif
        #endif /* LIB2_H_INCLUDED */
        

  • 5月前
    3 #

    使用gcc生成目標檔案,然後使用 ar 將它们捆绑到靜態庫中。

  • android:GridView行重叠:如何使行高適合最高專案?
  • !function($){$(function(){})}(windowjQuery)是做什麼的?