1. 程式人生 > >Linux和Windows平臺 動態庫.so和.dll文件的生成

Linux和Windows平臺 動態庫.so和.dll文件的生成

調用dll 動態 工程 pragma 基本 重要 變量 運行 com

Linux動態庫的生成

1、 純cpp文件打包動態庫

將所有cpp文件和所需要的頭文件放在同一文件夾,然後執行下面命令

gcc -shared - fpic *.c -o xxx.so;

g++ -std=c++17 - fpic *.cpp -o xxx.so;

[C++17標準,需要高版本gcc,本人采用gcc 8.2.0]

其中*.c代表所有的c文件,xxx.so中的xxx代表so動態庫的名字, -std=c++17代表采用C++17標準編譯。

2、 多個cpp文件和so庫一起打包成一個so

g++ -std=c++17 -fpic AFClassifier.cpp -shared -L. -lRandom -o test.so

3、 多個so打包為一個so

如果有兩個so,分別為 libRandom.so和libAF.so,並且在當前目錄下面,則執行下面命令:

g++ -std=c++17 -fpic -shared -L. -lAF -lRandom -o test.so

如果libRandom.so和libAF.so不在當前目錄,-L 後面要加上目錄,比如在當前目錄的下一層目錄,則:

g++ -std=c++17 -fpic -shared -L ./ -lAF -lRandom -o test.so

===========================================================

Windows動態庫的打包(dll)

1、 打開工程,在解決方案中打開屬性—》配置屬性:做以下修改:

“目標文件擴展名”:由默認的exe修改為dll

“配置類型”:選擇 動態庫dll

同時註意 配置 和 平臺 的版本。最好把release和debug下面的配置屬性都做上面的修改。

2、 在接口文件(也就是最重要的頭文件)添加兩處代碼:

1)

#ifdef LIBRARY_EXPORTS

# define LIBRARY_API __declspec(dllexport)

#else

# define LIBRARY_API __declspec(dllimport)

#endif

2)在調用函數前面加上“LIBRARY_AP”

當然 如果在接口函數前面直接寫上__declspec(dllimport)有時也可以,但是當遇到靜態變量或者靜態函數時,就不行了,我自己沒有真實測試過,看的博文這樣介紹的,博文連接如下:

【參考:https://blog.csdn.net/clever101/article/details/5421782】

3、 點擊生成解決方案,即可生成.dll文件。版本號要對應上前面的配置和平臺。輸出平臺顯示生成成功,即可查看生成的dll文件。

如果是X86平臺,則對應就是release和debug文件夾下面的dll文件

如果是X64平臺,則對應X64文件夾裏面的release和debug文件中的dll文件。

===========================================================================

Windows動態庫dll文件的使用

1、 從別人那裏獲取的動態庫最好要求x86,x64兩個release版本。方便不同版本的調試,雖然現在基本上用的都是X64。

2、 將動態庫dll和靜態庫lib,以及接口文件一起copy到工程裏面,在調試的主函數中加入下面這行代碼:#pragma comment(lib,"XXX.lib"),然後將接口文件import進來。Dll文件只需要放在工程中即可,代碼中不需要管dll文件,因為lib文件已經告訴你的工程該怎麽調用dll。

3、 運行,即可成功。如果不成功,查看平臺和配置是否在對著。

Linux和Windows平臺 動態庫.so和.dll文件的生成