从开发人员命令提示符或C中的MVS编译DLL库之间的区别

时间:2014-09-03 23:20:01

标签: c dll compilation visual-studio-2013

我编译了32位dll库,我有源文件和头文件。该库以某种方式显示打印对话框并允许我打印文件。我已经制作了32位C#应用程序,它在dll中调用打印功能,一切都很好。

但是,现在我需要将库重新编译为64位(重新编译我的C#项目很简单)。基本上我尝试了两种方法。

第一个是从Visual的Studio Developer命令提示符编译。这是第一次使用命令行编译一些东西,所以我用Google搜索了我应该写的内容。我没有尝试指定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位库。我用Google搜索并发现,我必须使用位于Program Files \ Microsoft Visual Studio 12.0 \ VC \ bin \ amd64中的不同cl.exe和link.exe。所以我cd-ed纠正文件夹并写了相同的命令。我有一堆“未解析的外部”,我用Google搜索并发现这是因为我试图链接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-选项到编译器,但我不知道如何修复休息,我找不到任何帮助。所以我决定使用Microsoft Visual Studio来构建我的库。 我创建了新的C ++项目,将其设置为DLL库,添加源文件和头文件,编译(使用标准设置,32位)。我有很多像这样的警告

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

和simmilars和一个错误

'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在print.c文件的第一行。单击“Build”按钮然后导致1成功,我得到了我的printing.dll。我替换了print.dll,我从命令行得到了这个,我使用我的C#app测试了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.

即使我按下“继续调试”,任何断点都会说它不会被击中,因为没有加载任何符号。

基本

如何在使用命令行编译为64位时摆脱“未解析的外部”错误?

OR

如何将Microsoft Visual Studio修复为构建的工作dll库(如果是32位或64位则无关紧要)?

1 个答案:

答案 0 :(得分:0)

确定。我设法解决了这个问题。我放弃了尝试使用命令行构建64位版本,并专注于修复有关中文字符的问题。我去了Project -> Project Properties -> Configuration Properties -> C/C++ -> Command Line看看传递了什么编译器参数。然后我回到命令行,逐个添加先前找到的参数并测试dll是否有效。当我添加/D "UNICODE"时,库停止了工作。

这就是说,添加#undef UNICODE或将Configuration Properties -> General -> Project Defaults -> Character Set设置为Not Set解决了我的问题,现在我能够为x86和x64架构编译我的打印库。