VS2010_C++_WinForm下 sqlite3.dll 如何连接?

ANN_RPS 2014-03-03 04:08:42
'囧'况:
想做一个图形界面的小软件,用的sqlite数据库。用的sqlite的dll文件,sqlite3.dll,也导出了sqlite3.lib。
项目分为多个部分,实为两类——控制台程序 和 Windows窗体应用程序。再控制台程序中,用了#pragma comment(lib,"XXX.lib")的方法,dll的调用很顺利。可在窗体程序中,调试出错。

错误信息如下:
1>系统设置.obj : warning LNK4248: 无法解析 typeref 标记(01000019)(为“sqlite3”);映像可能无法运行

1>系统设置.obj : error LNK2028: 无法解析的标记(0A00000C) "extern "C" int __clrcall sqlite3_open(char const *,struct sqlite3 * *)" (?sqlite3_open@@$$J0YMHPBDPAPAUsqlite3@@@Z),该标记在函数 "void __clrcall test(void)" (?test@@$$FYMXXZ) 中被引用

1>系统设置.obj : error LNK2019: 无法解析的外部符号 "extern "C" int __clrcall sqlite3_open(char const *,struct sqlite3 * *)" (?sqlite3_open@@$$J0YMHPBDPAPAUsqlite3@@@Z),该符号在函数 "void __clrcall test(void)" (?test@@$$FYMXXZ) 中被引用

1>C:\Users\……\系统设置.exe : fatal error LNK1120: 2 个无法解析的外部命令
1>
1>生成失败。


控制台程序部分,如下(调试成功):
#include "stdafx.h"
#include "stdlib.h"
extern "C"{
#include "./sqlite3.h"
}

#pragma comment(lib,"../lib/sqlite3.lib")

int _tmain(int argc, _TCHAR* argv[])
{
sqlite3 * db = NULL;
char * errmsg = NULL;
char * sql;
int result;


/*打开数据库,若无则创建之*/
result = sqlite3_open("../Data/MSTR.db", &db);
if(result != SQLITE_OK){
printf("数据库连接失败...");
system("pause");
return -1;
}

/* 创建各种数据表*/

sqlite3_close(db);
return 0;
}



Windows窗体程序部分,如下(调试失败):

#include "stdafx.h"
#include "stdlib.h"

extern "C"{
#include "./sqlite3.h"
}

#pragma comment(lib, "../lib/sqlite3.lib")

using namespace 系统设置;

void test();

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
//连接数据库
test();


// 在创建任何控件之前启用 Windows XP 可视化效果
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);

// 创建Login窗口并运行它
Application::Run(gcnew Login());
return 0;
}


void test(){
sqlite3 * db = NULL;
sqlite3_open("../Data/MSTR.db", &db);

/* 建表 或 查询 */
}


也试过在连接器->输入->附加依赖项 中加入lib,同样报错。

不知道问题出在哪里和如何解决,求大神解答。
谢谢~
...全文
302 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35155387 2016-05-29
  • 打赏
  • 举报
回复
引用 5 楼 u013593195 的回复:
问题解决了。。。原来是自动建立窗体时,项目的公共语言运行时支持变为了“/clr:pure”。 而“/clr:pure”模块和“lib”模块无法连接,所以“sqlite3.lib”并没有加载,导致找不到相关函数。 将“/clr:pure”改为“/clr”就好了。顺利接入lib入口,调用dll。 同样感谢版主的热心帮助~
楼主,我按照你说的把“/clr:pure”改为“/clr”了,可是 :warning LNK4248: 无法解析 typeref 标记(01000045)(为“sqlite3”);映像可能无法运行 要怎么解决?你的代码还在吗?能发给我参考吗?1038210252@qq.com
ANN_RPS 2014-03-04
  • 打赏
  • 举报
回复
问题解决了。。。原来是自动建立窗体时,项目的公共语言运行时支持变为了“/clr:pure”。 而“/clr:pure”模块和“lib”模块无法连接,所以“sqlite3.lib”并没有加载,导致找不到相关函数。 将“/clr:pure”改为“/clr”就好了。顺利接入lib入口,调用dll。 同样感谢版主的热心帮助~
漫步者、 2014-03-03
  • 打赏
  • 举报
回复
http://blog.csdn.net/ganpengjin1/article/details/19080487
漫步者、 2014-03-03
  • 打赏
  • 举报
回复
不用假如什么sqlite3.dll之类的,你看我的博客,有介绍如何配置sqlite3环境
ANN_RPS 2014-03-03
  • 打赏
  • 举报
回复
开发环境:VS2010 语言:C++ 项目:Windows窗体应用程序
ANN_RPS 2014-03-03
  • 打赏
  • 举报
回复
引用 2 楼 ganpengjin1 的回复:
http://blog.csdn.net/ganpengjin1/article/details/19080487
文章看过了,之前也试过把sqlite3.h和sqlite3.c加入工程项目。 但因为用的是WinForm,自动添加了CLR,结果总是报错:“不能使用 /clr 选项编译 C 文件”。 就是因为解决不了这个问题,所以才想到用动态链接库的,因为这样就不编译C源文件了。

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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