XE5的SOAP组件有bug?怎么提示Unresolved external 呢?

uhian 2014-07-28 01:00:09
开发一个WebService服务端,调试没问题准备发布,将Link with dynamic RTL改成false和Link with runtime packages改成fasle之后,Link出错。提示信息:


[ilink32 Error] Error: Unresolved external 'CertCloseStore' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\12.0\LIB\WIN32\DEBUG\SOAPRTL.LIB|Soap.SOAPHTTPTrans
[ilink32 Error] Error: Unresolved external 'CertFreeCertificateContext' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\12.0\LIB\WIN32\DEBUG\SOAPRTL.LIB|Soap.SOAPHTTPTrans
[ilink32 Error] Error: Unresolved external 'CertOpenSystemStoreW' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\12.0\LIB\WIN32\DEBUG\SOAPRTL.LIB|Soap.SOAPHTTPTrans
[ilink32 Error] Error: Unresolved external 'CertEnumCertificatesInStore' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\12.0\LIB\WIN32\DEBUG\SOAPRTL.LIB|Soap.Win.CertHelper

这种提示应该是光在头文件写了声明但是没实现才导致的吧,但我用的都是系统的组件,怎么会有这种问题呢?XE5的bug?
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
uhian 2014-07-29
  • 打赏
  • 举报
回复
向经验给分,哈哈。
uhian 2014-07-29
  • 打赏
  • 举报
回复
OK。又学到了。
ccrun.com 2014-07-29
  • 打赏
  • 举报
回复
soaprtl中调用了crypt32中的一些功能,手动就手动吧,你只要理解了那个链接错误是什么原因引起,如何解决就行了。
uhian 2014-07-29
  • 打赏
  • 举报
回复
引用 5 楼 ccrun 的回复:
淡定一点。 再加一个crypt32.lib
执着地认为XE5的问题,折腾一晚上换成XE6了,好吧,还是不行,我错了…… XE5添加这两个lib后正常了。XE6添加了也没用,提示信息变成这样: [ilink32 Error] Error: Unresolved external '__fastcall Soap::Wsdlpub::TWSDLHTMLPublish::ServiceInfo(System::TObject *, Web::Httpapp::TWebRequest *, Web::Httpapp::TWebResponse *, bool&)' referenced from C:\UHIAN\WSDEMO\WIN32\DEBUG\WEBMODULEUNIT1.OBJ [ilink32 Error] Error: Unresolved external 'Soap::Webbrokersoap::THTTPSoapDispatcher::' referenced from C:\UHIAN\WSDEMO\WIN32\DEBUG\WEBMODULEUNIT1.OBJ [ilink32 Error] Error: Unresolved external 'Soap::Soaphttppasinv::THTTPSoapCppInvoker::' referenced from C:\UHIAN\WSDEMO\WIN32\DEBUG\WEBMODULEUNIT1.OBJ [ilink32 Error] Error: Unresolved external 'Soap::Wsdlpub::TWSDLHTMLPublish::' referenced from C:\UHIAN\WSDEMO\WIN32\DEBUG\WEBMODULEUNIT1.OBJ 怎么出错信息还不一样呢,这个XE6先不管了吧,我就关心XE5。妖哥教教我,我觉得我用的系统组件,不应该让我自己加lib啊,而且我看了看工程选项的package里面,有soaprtl,为什么还要手动添加?另外为啥还要添加crypt32,从错误提示的哪个地方看出来的呢?这个crypt32就在release的psdk文件夹有,debug没有,难道是我的安装不全?
uhian 2014-07-29
  • 打赏
  • 举报
回复
引用 7 楼 ccrun 的回复:
我很好奇你这个工程是如何建立的,正常情况下,添加soap组件以后相应的lib会自动添加到工程中。 CertEnumCertificatesInStore是Windows API,所以需要添加对应的lib(其实最终的实现部分是在对应的.dll中),至于如何查哪个API是在哪个lib中,这个是经验。
用XE5的向导建立的,NEW SOAP Server Application -> Standalone VCL Application -> HTTP PORT:8080 -> finish -> Create interface for SOAP module -> YES -> Service Name:WSDemo,确定之后系统自动生成SOAP的WebModule,自动添加了三个组件HTTPSoapDispatcher1,HTTPSoapCppInvoker1,WSDLHTMLPublish1。然后查看工程选项里的Packages里面有soaprtl,但没有crypt32.lib。 刚才我试了,把soaprtl.lib从工程里面移除,还是可以连接成功的。但把crypt32.lib去掉后不行。这说明soaprtl其实确实是添加了,但crypt32.lib为啥要手动添加,不理解。
ccrun.com 2014-07-29
  • 打赏
  • 举报
回复
我很好奇你这个工程是如何建立的,正常情况下,添加soap组件以后相应的lib会自动添加到工程中。 CertEnumCertificatesInStore是Windows API,所以需要添加对应的lib(其实最终的实现部分是在对应的.dll中),至于如何查哪个API是在哪个lib中,这个是经验。
ccrun.com 2014-07-28
  • 打赏
  • 举报
回复
淡定一点。 再加一个crypt32.lib
uhian 2014-07-28
  • 打赏
  • 举报
回复
引用 3 楼 ccrun 的回复:
[quote=引用 2 楼 uhian 的回复:] 妖哥我错了,但我记得我有时候只写了头文件,没写实现也是这个提示呢。
是的,就是没有找到实现部分报这个错。我在1楼说的“只是需要的lib文件没有添加到工程中而已”是针对你的这个具体问题说的。[/quote] 妖哥,加进工程来了,还是不成。#pragma link也不行,崩溃。
ccrun.com 2014-07-28
  • 打赏
  • 举报
回复
引用 2 楼 uhian 的回复:
妖哥我错了,但我记得我有时候只写了头文件,没写实现也是这个提示呢。
是的,就是没有找到实现部分报这个错。我在1楼说的“只是需要的lib文件没有添加到工程中而已”是针对你的这个具体问题说的。
uhian 2014-07-28
  • 打赏
  • 举报
回复
妖哥我错了,但我记得我有时候只写了头文件,没写实现也是这个提示呢。
ccrun.com 2014-07-28
  • 打赏
  • 举报
回复
不要轻言BUG。出现这个链接错误,只是需要的lib文件没有添加到工程中而已,自己补上就是了,通过IDE菜单Project-->Add to Project或者用#pragma link指令。 CertCloseStore 的实现部分是在 soaprtl.lib 文件中。自己找找

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧