2013-10-08 47 views
0

我曾嘗試使用從館員下列選項>命令行一個DLL和LIB文件創建使用命令行從Visual Studio C++ 2010

/OUT:"mylib.lib" "mylib.dll" /DEF:"mydef.def" 

但是,它只產生的靜態庫。當我的DLL文件名在/OUT指令之前時,它只生成DLL,但不生成LIB。

我只是想創建DLL和LIB文件我的圖書館,而不必使用__declspec(dllimport)__declspec(dllexport)

有人能幫助我

回答

1

試試這個:

/OUT:"mylib.dll" /IMPLIB:"mylib.lib" /DEF:"mydef.def" /DLL 

在命令行中,您需要/DLL,但/IMPLIB不是必需的,因爲默認名稱將取決於您的DLL名稱。

從IDE編譯時,編譯有一個/LD參數,它確保/DLL傳遞給鏈接器。因此,如果您自己構建命令行,則需要明確指出。

+0

對不起!它仍然沒有生成LIB,只有DLL。輸出是: '1> LINK:警告LNK4044:無法識別的選項 '/IMPLIB:dynlibToSl.lib';忽略 1> LINK:警告LNK4044:無法識別的選項'/ DLL';忽略 1>創建庫dynlibToSl.dll和對象dynlibToSl.exp 1> dynlibToSl.vcxproj - > C:\ vcpp \ dynlibToSl \ Debug \ dynlibToSl.lib' – ha9u63ar

+0

@hagubear你正在運行'CL','MSBUILD','' LINK'或其他東西? –

+0

我剛剛注意到你對/ LD參數的評論。如果我將其作爲Visual Studio項目屬性表中的命令行選項添加,那麼是否需要添加/ LD,然後再添加您在答案中提供的內容? – ha9u63ar

1

你混合的東西了。 「庫管理器>命令行」設置僅在構建靜態庫項目時使用。輸出文件擴展名應該是.lib,/ DEF選項不適用。 .lib輸出文件本身是而不是的一個可執行文件,靜態庫只是簡單的.obj文件包。他們需要稍後在另一個建立EXE或DLL的項目中使用。

DLL是一個完全不同的動物,它是一個可執行文件格式和/ DEF選項是命名導出函數是有用的。當鏈接程序生成.dll時,它將爲創建DLL的.lib文件。這不是一個靜態庫,它是針對DLL的導入庫。一個只包含導出函數名稱的小文件,它與靜態庫不相似。當你建立另一個使用該DLL的項目時,你可以使用它。

不知道你在這個泡菜怎麼得了,我假設你剛開始用錯誤的項目模板。文件+新建項目,Visual C++,Win32,Win32項目。確定,然後,選擇應用程序類型設置的「DLL」單選按鈕。您的項目現在已正確配置爲生成DLL和LIB。使用鏈接器,輸入,模塊定義文件設置來指定您的DEF文件。一個DLL項目和一個靜態庫項目 - -

+0

我知道你在說什麼。我只是試圖不使用這些微軟的模板函數來解決DLL的導入導出問題。當你構建DLL時,你應該能夠使用visual studio或代碼塊或eclipse來構建它。這個想法是有一個DEF文件,以便DLL生成和函數導入導出更容易。但是,如果我無法同時生成一個DLL和一個靜態庫,我很高興接受這一點。看來我實際上無法做到!感謝您的回答。 – ha9u63ar

+1

__declspec(dllexport)不是微軟編譯器專有的,GCC和Clang也接受它,並以同樣的方式對待它。也許你正在努力避免一個有用的功能。然而,使用/ DEF是微軟鏈接器特有的。 –

+0

嗯....奇怪,我相信有一些不同,直到你告訴我,謝謝你讓我知道。我想我會修改我的計劃。 – ha9u63ar

0

如果你想要的是要建立既DLL,並從同一來源的靜態鏈接庫,你可能只是一個解決方案中創建兩個項目,並在同一源點他們文件。重建解決方案,presto!,DLL和靜態庫。 :^)

相關問題