我开始使用VC++ 2008 Express。我注意到GCC已经成为一种标准,所以我试图从一开始就制定正确的步骤。
我已经编写了一段通过ADO连接到SQL Server服务器的代码。在VC++上,它通过导入 MSADO15.dll 就可以像魔法一样工作:
#import“msado15.dll”no_namespace rename(“EOF”,“EndOfFile”)
因为我打算从VC迁移,所以我一直在寻找一个替代的(最终是多平台的)IDE,所以我坚持(这次)使用Code::Blocks(* 我使用的是最后一个夜间版本,SVN 6181*)。
作为编译器,我选择在Windows Vista下使用GCC 3.4.5(通过MinGW 5.1.6移植)。
我试图用GCC编译一个简单的“Hello, World!”应用程序,它使用/导入相同的msado15.dll(#import“c:\Program Files\Common Files\System\ADO\msado15.dll”no_namespace rename(“EOF”,“EndOfFile”)),我很惊讶地看到了很多编译时错误。
我期望#import编译器的指令将从“msado15.dll”生成一个库,这样它就可以在以后(链接编辑时间或其他时间)链接到它。相反,它试图将其作为一个普通文件(如头文件,如果你喜欢)读取,因为它试图解释DLL中的每一行(具有MZ签名):
示例:
编译:main.cpp
E:\MyPath\main.cpp:2:64:警告:#import指令末尾有额外的标记
在E:\MyPath\main.cpp:2包含的文件中:
c:\Program Files\Common Files\System\ADO\msado15.dll:1:错误:程序中的杂散'\144'
在E:\MyPath\main.cpp:2包含的文件中:
c:\Program Files\Common Files\System\ADO\msado15.dll:1:4:警告:忽略空字符
c:\Program Files\Common Files\System\ADO\msado15.dll:1:错误:程序中的杂散“\3”
c:\Program Files\Common Files\System\ADO\msado15.dll:1:6:警告:忽略空字符
c:\Program Files\Common Files\System\ADO\msado15.dll:1:错误:程序中的“\4”
......这是什么?
等等。
很明显,在这个版本的GCC下,#import指令不能完成预期的工作(也许GCC不再支持#import),那么我如何使用ADO访问用GCC编译的C程序上的SQL Server数据库(v3.4.5)?
3条答案
按热度按时间7ajki6be1#
你试图以非常非标准和MSVC特定的方式导入COM对象时会发生什么?
AFAIK的COM与MSYS的支持是远远不够完美的开始,搜索:Google中的“组件对象模型”和GCC。
我建议使用FreeTDS或像SOCI这样的库来与MS-SQL通信。它也是跨平台
;-)
gzjq41n42#
import指令不是标准C++编程语言的一部分。我不知道它在GCC中做了什么(如果有的话)。使用DLL的正常方法是在代码中包含其头文件,然后链接到其导入库(.LIB文件)。我从来没有用ADO编程过,但在ODBC中你会
在编译/链接时
获取导入库。
此外,您使用的MinGW编译器版本非常旧。你可以在http://tdragon.net/recentgcc上得到一个更新得多的。
7gcisfzg3#
GCC和MSVC使用#import来做不同的事情。在GCC中,#import是#include的objective-c变体,只包含一次头文件。在MSVC中,#import触发Microsoft扩展,该扩展从COM类型库构建智能指针实现和头文件。
在GCC中,你将不得不以老式的方式导入COM对象。查找现有的接口定义或使用像OleSpy这样的工具从tlb生成定义。