vs windows窗体连接sqlite3报错。win32应用程序完全没问题,数据库可以打开和读取等,windows应用窗体就不行了,正确配置了lib和include的路径,报的错莫名其妙:1 > sqlitetest1.obj : error LNK2031: 无法为 "extern "C" int __clrcall sqlite3_close(struct sqlite3 *)" (?sqlite3_close@@$$J0YMHPAUsqlite3@@@Z) 生成 p/invoke;元数据中缺少调用约定1 > sqlitetest1.obj : error LNK2031: 无法为 "extern "C" void __clrcall sqlite3_free_table(c-ar * *)" (?sqlite3_free_table@@$$J0YMXPAPAD@Z) 生成 p/invoke;元数据中缺少调用约定1 > sqlitetest1.obj : error LNK2031: 无法为 "extern "C" int __clrcall sqlite3_get_table(struct sqlite3 *,c-ar const *,c-ar * * *,int *,int *,c-ar * *)" (?sqlite3_get_table@@$$J0YMHPAUsqlite3@@PBDPAPAPADPAH-APAD@Z) 生成 p/invoke;元数据中缺少调用约定1 > sqlitetest1.obj : error LNK2031: 无法为 "extern "C" int __clrcall sqlite3_open(c-ar const *,struct sqlite3 * *)" (?sqlite3_open@@$$J0YMHPBDPAPAUsqlite3@@@Z) 生成 p/invoke;元数据中缺少调用约定1 > sqlitetest1.obj : warning LNK4248: 无法解析 typeref 标记(01000023)(为“sqlite3”);映像可能无法运行1 > sqlitetest1.obj : error LNK2028: 无法解析的标记(0A00001C) "extern "C" int __clrcall sqlite3_close(struct sqlite3 *)" (?sqlite3_close@@$$J0YMHPAUsqlite3@@@Z),该标记在函数 "bool __clrcall searc-_string_wit-_sql(c-ar *,int)" (?searc-_string_wit-_sql@@$$FYM_NPADH@Z) 中被引用1 > sqlitetest1.obj : error LNK2028: 无法解析的标记(0A00001D) "extern "C" void __clrcall sqlite3_free_table(c-ar * *)" (?sqlite3_free_table@@$$J0YMXPAPAD@Z),该标记在函数 "bool __clrcall searc-_string_wit-_sql(c-ar *,int)" (?searc-_string_wit-_sql@@$$FYM_NPADH@Z) 中被引用1 > sqlitetest1.obj : error LNK2028: 无法解析的标记(0A00001E) "extern "C" int __clrcall sqlite3_get_table(struct sqlite3 *,c-ar const *,c-ar * * *,int *,int *,c-ar * *)" (?sqlite3_get_table@@$$J0YMHPAUsqlite3@@PBDPAPAPADPAH-APAD@Z),该标记在函数 "bool __clrcall searc-_string_wit-_sql(c-ar *,int)" (?searc-_string_wit-_sql@@$$FYM_NPADH@Z) 中被引用1 > sqlitetest1.obj : error LNK2028: 无法解析的标记(0A00001F) "extern "C" int __clrcall sqlite3_open(c-ar const *,struct sqlite3 * *)" (?sqlite3_open@@$$J0YMHPBDPAPAUsqlite3@@@Z),该标记在函数 "bool __clrcall searc-_string_wit-_sql(c-ar *,int)" (?searc-_string_wit-_sql@@$$FYM_NPADH@Z) 中被引用1 > sqlitetest1.obj : error LNK2019: 无法解析的外部符号 "extern "C" int __clrcall sqlite3_close(struct sqlite3 *)" (?sqlite3_close@@$$J0YMHPAUsqlite3@@@Z),该符号在函数 "bool __clrcall searc-_string_wit-_sql(c-ar *,int)" (?searc-_string_wit-_sql@@$$FYM_NPADH@Z) 中被引用1 > sqlitetest1.obj : error LNK2019: 无法解析的外部符号 "extern "C" void __clrcall sqlite3_free_table(c-ar * *)" (?sqlite3_free_table@@$$J0YMXPAPAD@Z),该符号在函数 "bool __clrcall searc-_string_wit-_sql(c-ar *,int)" (?searc-_string_wit-_sql@@$$FYM_NPADH@Z) 中被引用1 > sqlitetest1.obj : error LNK2019: 无法解析的外部符号 "extern "C" int __clrcall sqlite3_get_table(struct sqlite3 *,c-ar const *,c-ar * * *,int *,int *,c-ar * *)" (?sqlite3_get_table@@$$J0YMHPAUsqlite3@@PBDPAPAPADPAH-APAD@Z),该符号在函数 "bool __clrcall searc-_string_wit-_sql(c-ar *,int)" (?searc-_string_wit-_sql@@$$FYM_NPADH@Z) 中被引用1 > sqlitetest1.obj : error LNK2019: 无法解析的外部符号 "extern "C" int __clrcall sqlite3_open(c-ar const *,struct sqlite3 * *)" (?sqlite3_open@@$$J0YMHPBDPAPAUsqlite3@@@Z),该符号在函数 "bool __clrcall searc-_string_wit-_sql(c-ar *,int)" (?searc-_string_wit-_sql@@$$FYM_NPADH@Z) 中被引用1 > D:\work\sqlitetest1\Debug\sqlitetest1- : fatal error LNK1120: 8 个无法解析的外部命令1 > 1 > 生成失败。1 个答案
答案 1:
答案调试信息很清楚了,编译器开了clr, 默认调用约定成了_clrcall, 而实际上sqlite函数使用的是_cdecl, 调用约定不正确linker就出错了,解决方法之一就是你在用到的sqlite3函数之前,明确是cdecl应该就能解决。 PS:中文版的VS描述很蛋疼。。比如(windows应用窗体,一些调试信息解释)个人觉得还是使用英文版的好,兄弟不妨试一下。