Windows下 如何製作動態庫和靜態庫

以前在linux下製作過動態庫和靜態庫,由於工作需要,需要在windows下做同樣的工作;有了以前的經驗所以做起來並不算很麻煩;

1、下載mingw-get-inst-20120426.exe

2、安裝之後會產生一個MinGW的目錄,將下面的bin目錄加入Path環境變量中,我的路徑在C:\MinGW\bin。


先查看下gcc的版本:

$ gcc.exe -v
 specs
COLLECT_GCC=c:\MinGW\bin\gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe
mingw32
../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --ee-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs -ld=mingw32 --prefix=/mingw
win32
gcc  4.6.2 (GCC)

查看gcc的使用方法:

用法:gcc.exe [選項] 文件...
選項:
  -pass-exit-codes         在某一階段退出時返回最高的錯誤碼
  --help                   顯示此幫助說明
  --target-help            顯示目標機器特定的命令行選項
  --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]
                           顯示特定類型的命令行選項
  (使用‘-v --help’顯示子進程的命令行參數)
  --version                顯示編譯器版本信息
  -dumpspecs               顯示所有內建 spec 字符串
  -dumpversion             顯示編譯器的版本號
  -dumpmachine             顯示編譯器的目標處理器
  -print-search-dirs       顯示編譯器的搜索路徑
  -print-libgcc-file-name  顯示編譯器伴隨庫的名稱
  -print-file-name=<庫>    顯示 <庫> 的完整路徑
  -print-prog-name=<程序>  顯示編譯器組件 <程序> 的完整路徑
  -print-multi-directory   顯示不同版本 libgcc 的根目錄
  -print-multi-lib         顯示命令行選項和多個版本庫搜索路徑間的映射
  -print-multi-os-directory 顯示操作系統庫的相對路徑
  -print-sysroot           顯示目標庫目錄
  -print-sysroot-headers-suffix 顯示用於尋找頭文件的 sysroot 後綴
  -Wa,<選項>               將逗號分隔的 <選項> 傳遞給彙編器
  -Wp,<選項>               將逗號分隔的 <選項> 傳遞給預處理器
  -Wl,<選項>               將逗號分隔的 <選項> 傳遞給鏈接器
  -Xassembler <參數>       將 <參數> 傳遞給彙編器
  -Xpreprocessor <參數>    將 <參數> 傳遞給預處理器
  -Xlinker <參數>          將 <參數> 傳遞給鏈接器
  -save-temps              不刪除中間文件
  -save-temps=<arg>        不刪除中間文件
  -no-canonical-prefixes   生成其他 gcc 組件的相對路徑時不生成規範化的
                           前綴
  -pipe                    使用管道代替臨時文件
  -time                    爲每個子進程計時
  -specs=<文件>            用 <文件> 的內容覆蓋內建的 specs 文件
  -std=<標準>              指定輸入源文件遵循的標準
  --sysroot=<目錄>         將 <目錄> 作爲頭文件和庫文件的根目錄
  -B <目錄>                將 <目錄> 添加到編譯器的搜索路徑中
  -v                       顯示編譯器調用的程序
  -###                     與 -v 類似,但選項被引號括住,並且不執行命令
  -E                       僅作預處理,不進行編譯、彙編和鏈接
  -S                       編譯到彙編語言,不進行彙編和鏈接
  -c                       編譯、彙編到目標代碼,不進行鏈接
  -o <文件>                輸出到 <文件>
  -x <語言>                指定其後輸入文件的語言
                           允許的語言包括:c c++ assembler none
                           ‘none’意味着恢復默認行爲,即根據文件的擴展名猜測
                           源文件的語言

以 -g、-f、-m、-O、-W 或 --param 開頭的選項將由 gcc.exe 自動傳遞給其調用的
 不同子進程。若要向這些進程傳遞其他選項,必須使用 -W<字母> 選項。

報告程序缺陷的步驟請參見:
<http://gcc.gnu.org/bugs.html>.


使用gcc製作動態庫:

測試程序:test.c test.h

#include <stdio.h>

int test(void)
{
        printf( "File:%s\n"
                "Line:%d\n"
                "Date:%s\n",__FILE__,__LINE__,__DATE__);
        return 0;
}

#ifndef __TEST_H__
extern int test(void);
#endif
編譯指令,這個在dos裏面運行:

gcc test.c --shared -o test.lib
程序調用庫測試:
#include <stdio.h>
#include "test.h"
int main()
{
        test();
        return 0;
}
gcc main.c -L./ test.lib -o test.exe
$ ./test.exe
File:test.c
Line:7
Date:Mar 12 2014
--shared 生成動態庫

-o 輸出文件

-L./ 連接路徑,./爲當前路徑


使用gcc + ar製作靜態庫:

1、使用gcc生產.o格式的文件

gcc -c test.c
2、使用ar連接,生產靜態庫
ar -cr test.a test.o


測試程序:

跟上面的一樣;

測試:

Administrator@-RAIN ~/Desktop
$ gcc main.c -L./ test.a -o test.exe

Administrator@-RAIN ~/Desktop
$ ./test.exe
File:test.c
Line:7
Date:Mar 12 2014

希望大家多多指點!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章