C語言動態庫的問題---Windows下使用VC

我記得有一種比較老式的方法是使用一個DEF文件來表明哪些函數是用來導出的,現在已經多不用該方式,而是使用__declspec(dllexport)的關鍵字。

下邊展示一種老方式的:

/*第一個文件 x.h*/

#include <stdio.h>

int print(int a);

/*第二個文件 x.c*/

#include "x.h"

int print(int i)
{
    printf("%d/n", i);
   
    return 0;
}

/*DEF文件 x.def*/

EXPORTS
    print

命令行編譯的時候使用:cl /LD x.c x.def,在命令行會顯示:

/out:x.dll
/dll
/implib:x.lib
/def:x.def
x.obj

   正在創建庫 x.lib 和對象 x.exp

如果沒有將def文件加上,就會是:

/out:x.dll
/dll
/implib:x.lib
x.obj

生成的dll文件使用Dependency Viewer看不到有任何導出來的方法,並且沒有生成EXP文件和LIB文件。然後使用如下的代碼就可以調用:

/*test.c*/

#include "x.h"

int main(int argc, char *argv[])
{
    printf("%d/n", print(100));
   
    return 0;
}

命令行:cl test.c /link x.lib

接下來展示新方式

/*第一個文件 x.h*/

#include <stdio.h>

__declspec(dllexport) int x();

/*第二個文件 x.c*/

#include "x.h"

int x()
{
    printf("hello world/n");
    return 0;
}

命令行: cl /LD a.c,生成了lib文件、dll文件、exp文件

/*test.c*/

#include "x.h"

int main(int argc, char *argv[])
{
    printf("%d/n", x());
   
    return 0;
}

編譯之後能夠正常運行。這種方式中 x.c文件的方法可以添加__declspec(dllexport) 限制,也可以不添加,沒影響。但是如果頭文件裏邊沒有這個限制,編譯出來的dll文件就沒有導出方法,不會生成lib和exp文件。如果僅在C文件中添加了,其結果就是編譯是編譯報告方法重定義問題。

如果編譯生成DLL和Lib之後將頭文件中的__declspec(dllexport)去掉,然後將頭文件和lib、dll一起發佈,是可以使用test.c引用的,並且能夠編譯出正確的程序並運行。

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