我記得有一種比較老式的方法是使用一個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引用的,並且能夠編譯出正確的程序並運行。