2014-09-03 65 views
0

編譯我有編譯的32位dll庫,我有它的源文件和頭文件。該庫以某種方式顯示打印對話框,並允許我打印文件。我製作了32位C#應用程序,它在dll中調用打印功能,一切都很好。編譯DLL庫從開發人員命令提示符或MVS在C

但是,現在我需要重新編譯庫到64位(重新編譯我的C#項目很容易)。基本上我嘗試了兩種方法。

第一個是從Visual Studio Studio開發人員命令提示符編譯。這是第一次使用命令行編譯東西,所以我搜索了我應該寫的東西。我並沒有試圖指定64位體系結構,因爲我想確保它正在工作。我用這個命令來構建它。

cl /D_USRDLL /D_WINDLL printing.c User32.Lib WinSpool.Lib Gdi32.Lib ComDlg32.Lib /link /DLL /OUT:printing.dll 

這讓printing.dll對我來說,我試圖取代預編譯的版本,我已經和我嘗試了用我的C#應用​​程序。一切正常。所以我想將它編譯爲64位庫。我搜索並發現,我必須使用位於Program Files \ Microsoft Visual Studio 12.0 \ VC \ bin \ amd64中的不同cl.exe和link.exe。所以我cd-ed來糾正文件夾並編寫相同的命令。我有一堆「無法解析的外部」,我搜索了一下,發現它是因爲我試圖鏈接32位庫。所以我將所有* .Lib-s改爲C:\ Program Files(x86)\ Windows Kits \ 8.1 \ Lib \ winv6.3 \ um \ x64 * .Lib「,重試並仍然有一些(16)未解析的extarnals。在名單

/out:printing.exe 
/DLL 
/OUT:D:\Temp\printing\printing.dll 
printing.obj 
"C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64\User32.Lib" 
"C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64\WinSpool.Lib" 
"C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64\Gdi32.Lib" 
"C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64\ComDlg32.Lib" 
    Creating library D:\Temp\printing\printing.lib and object D:\Temp\printing\printing.exp 
printing.obj : error LNK2019: unresolved external symbol __report_rangecheckfailure referenced in function RSS_PrintFile 
printing.obj : error LNK2019: unresolved external symbol strcpy referenced in function RSS_PrintFileBez 
printing.obj : error LNK2019: unresolved external symbol strcmp referenced in function RSS_PrintFileBez 
printing.obj : error LNK2019: unresolved external symbol strlen referenced in function RSS_PrintFile 
printing.obj : error LNK2019: unresolved external symbol __imp_CreateFileA referenced in function RSS_PrintFile 
printing.obj : error LNK2019: unresolved external symbol __imp_ReadFile referenced in function RSS_PrintFile 
printing.obj : error LNK2019: unresolved external symbol __imp_CloseHandle referenced in function RSS_PrintFile 
printing.obj : error LNK2019: unresolved external symbol __imp_GlobalFree referenced in function RSS_PrintFile 
printing.obj : error LNK2019: unresolved external symbol __imp_LocalAlloc referenced in function RSS_PrintFileBez 
printing.obj : error LNK2019: unresolved external symbol __imp_LocalHandle referenced in function RSS_PrintFileBez 
printing.obj : error LNK2019: unresolved external symbol __imp_LocalFree referenced in function RSS_PrintFileBez 
printing.obj : error LNK2019: unresolved external symbol atoi referenced in function RSS_PrintFileBezFromTo 
printing.obj : error LNK2001: unresolved external symbol __GSHandlerCheck 
printing.obj : error LNK2019: unresolved external symbol __security_check_cookie referenced in function RSS_PrintFile 
printing.obj : error LNK2019: unresolved external symbol __security_cookie referenced in function RSS_PrintFile 
LINK : error LNK2001: unresolved external symbol _DllMainCRTStartup 
D:\Temp\printing\printing.dll : fatal error LNK1120: 16 unresolved externals 

我設法擺脫4周無法解析的外部添加/ GS-選項編譯器,但我不知道如何解決的休息和我找不到任何幫助,所以我決定用微軟我創建了一個新的C++項目,將它設置爲一個DLL庫,添加了源代碼和頭文件,編譯了(使用32位的標準設置)。我有一堆警告,比如這一個

'function' : incompatible types - from 'char *' to 'LPCWSTR' 

和simmilars和printing.c文件的第一行有一個錯誤

'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 

所以我#include _CRT_SECURE_NO_WARNINGS。 Hiting「Build」按鈕然後導致1成功,我得到了我的printing.dll。我用命令行取代了這個打印文件,並使用我的C#應用​​程序測試了dll。按打印按鈕帶來「選擇打印機等」窗口(如前),但打印導致打開small window with some chinese text。不過,我可以輕鬆將其構建爲64位。

我想問我做錯了什麼,爲什麼我不能從命令提示符編譯C庫,以及爲什麼Microsoft Visual Studio不知何故使DLL無法正常工作。

我試圖調試使用MVS編譯的DLL庫,但我失敗了。我不知道應該打開哪個解決方案(C#測試應用程序或C DLL解決方案)以及接下來要做什麼。 C#不會顯示我的代碼從另一種解決方案,即使我起來DLL解決方案debuger打開C#應用程序它產生錯誤

Debugginng information for "app.exe" could not be found or does not match. Skipped loading symbols for NGen binary. 

即使我按「繼續調試」,任何斷點說,它不會被打,因爲沒有符號被加載。

所以Basicly

如何擺脫「無法解析外部」的錯誤,而作爲編譯使用命令行64位?

OR

如何解決微軟的Visual Studio內置工作的dll庫(不要緊,如果32位或64位)?

+0

從未打算過的情況下,將32位庫重新編譯爲64位是遠遠不平凡的任務。從我在這裏看到的你絕對無法接受這一點。尋求專業人士的幫助,最好與原作者協商。 – 2014-09-03 23:53:43

+0

我明白了,但爲什麼使用開發人員命令提示符編譯工作,但使用Microsoft Visual Studio編譯不? – Zereges 2014-09-04 00:24:52

+0

@Zereges - 你爲什麼通過命令行做到這一點?爲什麼不採用工作的32位'Visual Studio項目',添加'X64'配置並重建?爲什麼你採取更容易出錯的方法,而不是做簡單的事情,只是創建一個'x64'配置? – PaulMcKenzie 2014-09-04 01:36:16

回答

0

好的。我已經設法解決這個問題。我放棄了試圖使用命令行構建64位版本,並着重解決有關中國字符的問題。我去了Project -> Project Properties -> Configuration Properties -> C/C++ -> Command Line看看通過什麼編譯參數。然後我回到命令行,並逐個添加以前找到的參數並測試dll是否可用。當我加入/D "UNICODE"時,圖書館停止工作。

這就是說,加入#undef UNICODE或設置Configuration Properties -> General -> Project Defaults -> Character SetNot Set解決了我的問題,現在我能夠編譯我的打印庫的x86和x64體系結構。

相關問題