雖然我沒有問題通過Visual Studio設置運行時DLL加載,但在通過Visual Studio CLI工具手動執行時遇到了一些麻煩。如何通過命令行設置VC++動態鏈接?
假設我們有以下2個簡單的C++源代碼文件,我們想編譯一個二進制可執行文件,一個用於DLL:
的main.cpp
void say_hello();
int main()
{
say_hello();
return 0;
}
say_hello的.cpp
#include <stdio.h>
void say_hello()
{
printf("Hello DLL World!");
}
什麼是編譯步驟3210文件作爲DLL然後動態鏈接它與main.cpp
的呼叫?
基礎上,通過MSDN文檔我讀,我能成功編譯say_hello.dll
和應用程序,然後運行它,用下面的命令:
cl say_hello.cpp /LD
lib say_hello.obj
cl say_hello.lib main.cpp
不幸的是,這似乎只允許靜態鏈接該應用程序通過say_hello.lib
文件(可以通過刪除.lib和.dll文件來確認,該文件仍然允許二進制文件成功運行)。
我必須將哪些命令/參數傳遞給編譯/鏈接階段才能讓main.exe
使用DLL而不是靜態庫?
'cl say_hello.cpp/LD'應該在.lib文件中產生DLL和一個導入庫。隨後的'lib'命令會用靜態庫覆蓋前面提到的導入庫。只是不要那樣做。另一個問題是名稱需要通過DEF文件或'__declspec(dllexport)'從DLL中顯式導出。正如所寫的,你不會輸出任何東西,所以沒有什麼可以實際鏈接到的。 –
Ahhh yes ...第一步'cl say_hello.cpp/LD'的控制檯輸出似乎表明「/implib:say_hello.lib」確實被創建,但我只能看到'say_hello.obj'和在目錄中生成'say_hello.dll'。是否有其他國旗通過告訴它不要清理進口圖書館? – depthfirstdesigner
Ahh我看到'__declspec(dllexport)'宏作爲要導出函數的前綴是非常重要的,因爲沒有它,cl.exe會在完成後立即刪除導入庫文件'say_hello.lib'。 – depthfirstdesigner