请问BCB调用hiredis.lib库会提示找不到外部函数

weixin_40294067 2018-05-24 05:32:29
源码如下,hiredis.lib库是VS2015编译的静态库,已经用BCB工具转换了

测试的时候出现了找不到外部库,求各位大神指点一下


#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif

#include <winsock2.h>
#include <stdio.h>
using namespace std;

#include "hiredis/hiredis.h"
#pragma comment(lib,"hiredis.lib")

int _tmain(int argc, _TCHAR* argv[])
{
unsigned int j;
redisContext *c;
redisReply *reply;

c = redisConnect((char*)"127.0.0.1", 6379);
if (c->err) {
printf("Connection error: %s\n", c->errstr);
}
/* PING server */
reply = (redisReply *)redisCommand(c, "PING");
printf("PING: %s\n", reply->str);
freeReplyObject(reply);

/* Set a key */
reply = (redisReply *)redisCommand(c, "SET %s %s", "foo", "hello world");
printf("SET: %s\n", reply->str);
freeReplyObject(reply);

/* Set a key using binary safe API */
reply = (redisReply *)redisCommand(c, "SET %b %b", "bar", 3, "hello", 5);
printf("SET (binary API): %s\n", reply->str);
freeReplyObject(reply);

/* Try a GET and two INCR */
reply = (redisReply *)redisCommand(c, "GET foo");
printf("GET foo: %s\n", reply->str);
freeReplyObject(reply);

reply = (redisReply *)redisCommand(c, "INCR counter");
printf("INCR counter: %lld\n", reply->integer);
freeReplyObject(reply);
/* again ... */
reply = (redisReply *)redisCommand(c, "INCR counter");
printf("INCR counter: %lld\n", reply->integer);
freeReplyObject(reply);

/* Create a list of numbers, from 0 to 9 */
reply = (redisReply *)redisCommand(c, "DEL mylist");
freeReplyObject(reply);
for (j = 0; j < 10; j++) {
char buf[64];

sprintf_s(buf, 64, "%d", j);
reply = (redisReply *)redisCommand(c, "LPUSH mylist element-%s", buf);
freeReplyObject(reply);
}

/* Let's check what we have inside the list */
reply = (redisReply *)redisCommand(c, "LRANGE mylist 0 -1");
if (reply->type == REDIS_REPLY_ARRAY) {
for (j = 0; j < reply->elements; j++) {
printf("%u) %s\n", j, reply->element[j]->str);
getchar();
}
}
freeReplyObject(reply);
return 0;
}


错误问题:
[ilink32 Error] Error: Unresolved external '_redisConnect' referenced from C:\USERS\MAYN\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\WIN32\DEBUG\REDISTEST.OBJ
[ilink32 Error] Error: Unresolved external '_redisCommand' referenced from C:\USERS\MAYN\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\WIN32\DEBUG\REDISTEST.OBJ
[ilink32 Error] Error: Unresolved external '_freeReplyObject' referenced from C:\USERS\MAYN\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\WIN32\DEBUG\REDISTEST.OBJ
[ilink32 Error] Error: Unable to perform link

...全文
1148 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_40294067 2018-05-25
  • 打赏
  • 举报
回复
引用 14 楼 DelphiGuy 的回复:
implib -s xxx.lib redisdll.dll 你可以换一个高版本的implib.exe试试,低版本没有-s选项
我用了-s生成的.lib 里面内容是 000550 THEADR redisConnectWin 000564 COMENT Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h) Dynamic link import (IMPDEF) Imported by: ordinal Internal Name: redisConnectWin Module Name: redisdll.dll ordinal: 15 00058B COMENT Purge: Yes, List: Yes, Class: 251 (0FBh), SubClass: 3 (03h) Hint:14 000594 MODEND 但是还是报了 [ilink32 Error] Error: Unresolved external '__stdcall redisConnectWin(const char *, int)' referenced from D:\PROJECTS\REDISTEST\WIN32\DEBUG\UNIT1.OBJ 这究竟是哪里出了问题? #pragma hdrstop #include "Unit1.h" #include "hirediswin.h" // #pragma comment(lib,"redis.lib") // --------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; // --------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } // --------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { redisContext *r; r = redisConnectWin((char *)"127.0.0.1", 6379); if (!r->err) { UnicodeString str = "ok"; Edit1->Text = str; } } 上面是源码,调用的,那个我直接把.lib加到工程中去了,还是找不到,这个问题真是无解,BCB版本是Embarcadero® RAD Studio 10.2 Version 25.0.26309.314 Copyright © 2017 Embarcadero Technologies, Inc. All Rights Reserved. 不知道有上面影响不
  • 打赏
  • 举报
回复
implib -s xxx.lib redisdll.dll 你可以换一个高版本的implib.exe试试,低版本没有-s选项
weixin_40294067 2018-05-25
  • 打赏
  • 举报
回复
引用 7 楼 DelphiGuy 的回复:
[quote=引用 3 楼 weixin_40294067 的回复:] 在VS那边生成的静态lib 和动态DLL 在VS测试能过,一放到BCB就是报找不到外部函数的,静态库我用了BCB中的coff2omf工具转换了,动态DLL 我用了implib都转过,但是都是一样的的结果还是报[ilink32 Error] Error: Unresolved external 'redisConnectWin(const char *, int)' referenced from D:\PROJECTS\REDISTEST\WIN32\DEBUG\UNIT1.OBJ这样的错误
问题应该出在: #pragma comment(lib,"hiredis.lib") 这一句 这是VC++的语法(intel c++也认),CB、GCC之类的不认,需要把.lib加入到工程中(project->add to project...)。 [/quote] 还是没有解决,我把.lib文件加入到工程中还是报[ilink32 Error] Error: Unresolved external '__stdcall redisConnectWin(const char *, int)' referenced from D:\PROJECTS\REDISTEST\WIN32\DEBUG\UNIT1.OBJ这个错误, dll是VS2015编译的,.lib是通过BCB 的implib转的.lib文件,我看了.lib里面的信息是这样的0005F0 THEADR _redisConnectWin 000605 COMENT Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h) Dynamic link import (IMPDEF) Imported by: name Internal Name: _redisConnectWin Module Name: redisdll.dll Imported name: redisConnectWin 00063B MODEND 按道理是可以调用的,这个DLL我在VS2015测试是可以调用的,然后再BCB2010就不可以,而且BCB我不知道怎么设置启动依赖项,类似VS设置了依赖项就能编译通过且能调用; BCB 调用VS 生成DLL 会出现[ilink32 Error] Error: Unresolved external '__stdcall redisConnectWin(const char *, int)' referenced from D:\PROJECTS\REDISTEST\WIN32\DEBUG\UNIT1.OBJ这个问题,我也试过BCB调用VS 生成的静态lib库,也会出现上述的问题,因为之前没用过BCB,出现的问题不知道怎么解决,网上的资料我看了好多都不能解决
ooolinux 2018-05-25
  • 打赏
  • 举报
回复
引用 11 楼 DelphiGuy 的回复:
解决方法(2)是错的,实测不能转换静态库,生成的是空白.lib,里面无内容。
可能以前老版本可以。
  • 打赏
  • 举报
回复
解决方法(2)是错的,实测不能转换静态库,生成的是空白.lib,里面无内容。
ooolinux 2018-05-25
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
[quote=引用 2 楼 u010165006 的回复:] [quote=引用 1 楼 DelphiGuy 的回复:] CB中的coff2omf工具只能转换动态库,静态库不行,可以试一下objconv: http://www.agner.org/optimize/objconv.zip
不是说implib转换动态库,coff2omf转换静态库? [/quote] implib是从DLL直接生成导入库(相当于ms的dumpbin和lib的组合功能),coff2omf是把coff格式的导入库转换成omf格式的导入库,导入库都是动态的,只包括符号信息,没有代码。 [/quote] 这个文档是这样写的: VC与BCB库文件之间的转换问题 VC++的.lib有两种:一种是静态DLL,其中包括函数的实际代码,一种是有DLL生成的.lib,其中并不包含代码,只是包含DLL的链接信息。对于后一种比较简单,只需要使用C++ Builder中的命令行工具implib直接对DLL进行进行转换就可以了。 只有前一种才存在你说的转换问题。另外一点要看.lib中的内容,如果是普通的C语言函数,可以转换,如果是C++类,则不能直接转换为DLL,因为即使你直接编译为DLL,也只有VC的程序才能使用(那何必费这事),即使C++ Builder也不能调用,你必须把类转换为普通的C语言函数,才能供其他函数调用。 经常碰到类似:BCB contains invalid OMF record,type 0x21(possibly COFF)错误,该错误是由于BCB使用VC的lib兼容不足导致。 解决方法(1):从vc生成的动态库导出c++builder可用的导入库(注意:不是静态库),在Borland目录下找到Borland\CBuilder6\Bin里面有一个implib.exe,它可以将VC的DLL转译为BCB的lib;你只需将VC的DLL拷贝到该同级目录下,编写一个.bat文件:implib -af XXX.lib XXX.dll 就会将XXX.dll编译成BCB的XXX.lib再将此lib拷贝到应用程序工作目录下就可以正常运行了 解决方法(2):把vc生成的静态库(注意:不是导入库)转换成c++builder可用的静态库;在Borland目录下找到Borland\CBuilder6\Bin里面有一个coff2omf.exe,先把需要转换的VC的ml.lib放在C盘根目录下,然后生成新的C++Builder格式下的ml1.lib文件,在命令行: coff2omf -lib:ms c:/ml.lib bcb c:/ml1.lib
ooolinux 2018-05-25
  • 打赏
  • 举报
回复
摘的: 【查看——工程管理器】窗口,可以查看整个工程的文件组织,可以从工程中移除、向工程中添加单元文件(*.cpp)、资源文件(*.rc)、库文件(*.lib)等。
  • 打赏
  • 举报
回复
引用 4 楼 weixin_40294067 的回复:
[quote=引用 1 楼 DelphiGuy 的回复:] CB中的coff2omf工具只能转换动态库,静态库不行,可以试一下objconv: http://www.agner.org/optimize/objconv.zip
objconv是什么工具?[/quote] obj文件(.lib是obj的合集)格式转换和反汇编工具。
  • 打赏
  • 举报
回复
引用 3 楼 weixin_40294067 的回复:
在VS那边生成的静态lib 和动态DLL 在VS测试能过,一放到BCB就是报找不到外部函数的,静态库我用了BCB中的coff2omf工具转换了,动态DLL 我用了implib都转过,但是都是一样的的结果还是报[ilink32 Error] Error: Unresolved external 'redisConnectWin(const char *, int)' referenced from D:\PROJECTS\REDISTEST\WIN32\DEBUG\UNIT1.OBJ这样的错误
问题应该出在: #pragma comment(lib,"hiredis.lib") 这一句 这是VC++的语法(intel c++也认),CB、GCC之类的不认,需要把.lib加入到工程中(project->add to project...)。
titan_ysl 2018-05-25
  • 打赏
  • 举报
回复
我记得用implib转换dll文件后,可生成.dll和.lib文件,最简单的,把dll文件放在你编译后的程序处,把.lib文件放在你的工程文件所在的路径里,之后在工程中添加这个库文件,这样在编译时就不会报Unresolved external '这种错误了。
  • 打赏
  • 举报
回复
引用 2 楼 u010165006 的回复:
[quote=引用 1 楼 DelphiGuy 的回复:] CB中的coff2omf工具只能转换动态库,静态库不行,可以试一下objconv: http://www.agner.org/optimize/objconv.zip
不是说implib转换动态库,coff2omf转换静态库? [/quote] implib是从DLL直接生成导入库(相当于ms的dumpbin和lib的组合功能),coff2omf是把coff格式的导入库转换成omf格式的导入库,导入库都是动态的,只包括符号信息,没有代码。
weixin_40294067 2018-05-25
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
CB中的coff2omf工具只能转换动态库,静态库不行,可以试一下objconv: http://www.agner.org/optimize/objconv.zip
objconv是什么工具?
weixin_40294067 2018-05-25
  • 打赏
  • 举报
回复
在VS那边生成的静态lib 和动态DLL 在VS测试能过,一放到BCB就是报找不到外部函数的,静态库我用了BCB中的coff2omf工具转换了,动态DLL 我用了implib都转过,但是都是一样的的结果还是报[ilink32 Error] Error: Unresolved external 'redisConnectWin(const char *, int)' referenced from D:\PROJECTS\REDISTEST\WIN32\DEBUG\UNIT1.OBJ这样的错误
ooolinux 2018-05-25
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
CB中的coff2omf工具只能转换动态库,静态库不行,可以试一下objconv: http://www.agner.org/optimize/objconv.zip
不是说implib转换动态库,coff2omf转换静态库?
  • 打赏
  • 举报
回复
CB中的coff2omf工具只能转换动态库,静态库不行,可以试一下objconv: http://www.agner.org/optimize/objconv.zip

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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