将C的代码,转到VC++后编译失败:error LNK2028: unresolved token /error LNK2019: unresolved external symbol

anna_aiya 2007-08-22 11:36:28
将C下的代码直接Copy到VC++下,编译错误。如何解决?
主要有以下两类错误

Test.obj : error LNK2028: unresolved token (0A000036) "int __stdcall cmpp30icp_convert_src_addr_to_base64(char *,char *)" (?cmpp30icp_convert_src_addr_to_base64@@$$FYGHPAD0@Z) referenced in function "void __cdecl print_deliver_packet(struct cmpp30icp_deliver *)" (?print_deliver_packet@@$$FYAXPAUcmpp30icp_deliver@@@Z)


Test.obj : error LNK2019: unresolved external symbol "unsigned __int64 __stdcall ntohll(unsigned __int64)" (?ntohll@@$$FYG_K_K@Z) referenced in function "void __cdecl print_deliver_packet(struct cmpp30icp_deliver *)" (?print_deliver_packet@@$$FYAXPAUcmpp30icp_deliver@@@Z)
...全文
1055 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fish6344 2007-08-23
  • 打赏
  • 举报
回复
并不是所有C的源代码都可以直接粘贴到C++的.cpp文件,就可以顺利通过链接器而得到.exe!
其中关于函数的调用方式,名字解析,变量的初始经规定等等都有不同,你没提供源代码,我也就只能这样回答你了。
星羽 2007-08-23
  • 打赏
  • 举报
回复

把你的代码贴贴


冷月清晖 2007-08-23
  • 打赏
  • 举报
回复
study~
jixingzhong 2007-08-23
  • 打赏
  • 举报
回复
然后在 工程导航中, 右键单击工程名,添加文件 api.lib 到工程中, 编译链接
jixingzhong 2007-08-23
  • 打赏
  • 举报
回复
api.lib 、api.dll 拷贝到工程所在的目录下
feimingbiao 2007-08-23
  • 打赏
  • 举报
回复
cmpp30icp_convert_src_addr_to_base64 这个是Lib里面的吧? 把所有Lib里面实现的函数Declare的时候都加上:

extern "C"

你的问题是Lib还是C编译的,没有做name mangling, C++ 的部分做了,所以找不到了。
anna_aiya 2007-08-23
  • 打赏
  • 举报
回复
编译错误:
Test.obj : error LNK2028: unresolved token (0A00001D) "extern "C" int __stdcall cmpp30_connect_to_ismg(char *,unsigned short,struct cmpp30_icp_trans *)" (?cmpp30_connect_to_ismg@@$$J212YGHPADGPAUcmpp30_icp_trans@@@Z) referenced in function "int __cdecl main(int,char * *)" (?main@@$$HYAHHPAPAD@Z)



好像在api.h里面只定义了函数头,没有实现。
我还有个api.lib 、api.dll。这两个文件该怎么用?
anna_aiya 2007-08-23
  • 打赏
  • 举报
回复
调用的cpp文件如下:

extern "C"
{
#include "api.h"
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char ** argv)
{
dpl_status_t stat;

cmpp30_icp_trans conn;

cmpp30icp_submit cs;
cmpp30icp_login cl;

cmpp30_icp_packet icp_packet;
cmpp30icp_deliver_rsp deliver_rsp;


dpl_uint32_t status = 0;
int type,seq;
dpl_uint8_t result;

memset(&cs,0,sizeof(cmpp30icp_submit));
memset(&cl,0,sizeof(cmpp30icp_login));
memset(&conn,0,sizeof(conn));
memset(&icp_packet, 0, sizeof(cmpp30_icp_packet));


stat = cmpp30_connect_to_ismg("10.20.55.11",1011,&conn);//与网关建立socket连接
if(stat != DPL_SUCCESS){
printf("cmpp30_connect_to_ismg stat is %d\n", stat);
goto finished;
}

......
}
anna_aiya 2007-08-23
  • 打赏
  • 举报
回复
api.h文件如下:


#ifndef _API_H
#define _API_H

/* 如果是在unix平台上编译,打开下面的注释 */
//#define WINAPI

#ifdef _WIN32
#include <winsock2.h>
#endif

#include <assert.h>
#include <errno.h>


#ifdef __cplusplus
extern "C"{
#endif


......


/***
* 功能:与网关建立socket连接
* 参数:char *host 网关ip
* dpl_port_t port 网关监听端口
* cmpp30_icp_trans *conn 连接描述符结构
* 返回值:0 成功
* 其它 失败
***/
CMPP_API dpl_status_t WINAPI cmpp30_connect_to_ismg(char *host,dpl_port_t port, cmpp30_icp_trans *conn);


......



#ifdef __cplusplus
}
#endif

#endif
anna_aiya 2007-08-23
  • 打赏
  • 举报
回复
1、api.lib 、api.dll 拷贝到工程所在的目录下
2、然后在 工程导航中, 右键单击工程名,添加文件 api.lib 到工程中

重新编译通过。搞定...

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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