error LNK2019: unresolved external symbol的疑惑

波特王子 2009-11-04 04:15:24
出现了error LNK2019: unresolved external symbol错误
这个*.lib文件已经附件进去,*.h文件也包含进了工程,令人不解的是,这个*.lib里边的class有几个成员函数同时被调用了,而前面的调用都能够链接,为什么就后面一个函数出现了unresolved external symbol,而我新建一个项目,去做同样的配置就一点问题都没有,编译链接运行都很正常,为什么呢?
...全文
13401 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
huaihaillu 2011-07-09
  • 打赏
  • 举报
回复
这个问题也困扰了我很久,将dll工程和主程序的字符集改为multi那个选项就可以了
阳澄天天 2009-11-25
  • 打赏
  • 举报
回复
我好像也遇到了那样的问题,出现unresolved external symbol的后一个函数可能调用了其他一些Windows的API吧,这样在编译链接dll的时候就没有问题,但是在把类实例化调用的时候就提示unresolved external symbol,就是在调用的文件中写明include 那个API所在的头文件都不行,后来我没有用那个API,自己写了个实现,就通过编译并且能调用了。
我的例子如下:
---- SockAddr.h in DLL ----
#pragma once
#ifndef SOCK_ADDR_H
#define SOCK_ADDR_H

#ifdef DLL_FILE_SOCKADDR
#define CLASS_DECL __declspec(dllexport)
#else
#define CLASS_DECL __declspec(dllimport)
#endif

class CLASS_DECL CSockAddr : public sockaddr_in // note: sockaddr_in 是在<winsock2.h>中定义的,
{
public:
CSockAddr(void);
~CSockAddr(void);
CString DottedDecimal();
USHORT Port() const;
};
#endif

---- SockAddr.cpp in DLL ----
#ifndef DLL_FILE_SOCKADDR
#define DLL_FILE_SOCKADDR
#endif

#include "stdafx.h"
#include "SockAddr.h"

CSockAddr::CSockAddr(const char* pchIP, const USHORT ushPort = 0)
{
sin_family = AF_INET;
sin_port = htons(ushPort);
sin_addr.s_addr = inet_addr(pchIP);
}

CSockAddr::~CSockAddr(void)
{
}

// Note: 这个函数能在别处导出类后调用,没有问题
USHORT CSockAddr::Port() const
{
return ntohs(sin_port);
}

// Note: 这个函数在别处用导出类对象调用时报unresolved external symbol错误
// 后来不用inet_ntoa这个接口,自己重写了一段,就调用成功了
CString CSockAddr::DottedDecimal()
{
// code does not work
//return CString(inet_ntoa(sin_addr));

// code does work
CString str;
str.Format("%d.%d.%d.%d", sin_addr.S_un.S_un_b.s_b1, sin_addr.S_un.S_un_b.s_b2, sin_addr.S_un.S_un_b.s_b3, sin_addr.S_un.S_un_b.s_b4);
return str;
}

--- 调用处代码 (in a dialog)------
// test exported class from DLL
CSockAddr sock_addr("127.0.0.1", 80);
unsigned short port = sock_addr.Port(); // 可以调用
CString str = sock_addr.DottedDecimal(); // 函数内部使用inet_ntoa时候报错,不用它才编译成功

PS: 我只是知道如何避免这个问题,绕过去了,但不知道为什么? 不知道有没有更好的办法,希望各位兄弟不吝赐教。

波特王子 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 skyworld2288 的回复:]
引用 9 楼 skyworld2288 的回复:
如果原先没有问题的话,我猜想那个包含在include文件里面声明的函数是否有static
修饰的函数,static 成员函数对外是隐藏的,你可能在原先时候没有用到static函数,可以调用哪个lib,
而后面你用到了那个库里面的static 成员函数,所以报你说的错,完全合理。


补充下,建议你打开那个.h文件查看下,你代码里面是否是调用到static成员函数,确认我说的是否是正确的。
[/Quote]

谢谢你说得这么详细,不是这个问题呢
我现在把这个问题初步断定为跟stlport冲突,因为在另一个环境下把stlport的配置删掉就没问题了。(在这里设置的:工具->选项->项目和解决方案->VC++目录 )但是问题是,我当前的工程没有stlport不行啊,呜呜~~~
波特王子 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 feifanup 的回复:]
正是因为你检查了n遍,
看太多次了,看得把错的当对的了

所以还是出去转一会儿吧~~~~
或者去便便
回来肯定能发现问题!!
[/Quote]
兄弟真幽默,O(∩_∩)O哈哈~
这个问题发现好多天了,很郁闷啊
我现在把这个问题初步断定为包含stlport包的问题,因为在另一个环境下stlport的包含文件目录配置错了就出现了同样的问题。(在这里设置的:工具->选项->项目和解决方案->VC++目录 )
skyworld2288 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skyworld2288 的回复:]
如果原先没有问题的话,我猜想那个包含在include文件里面声明的函数是否有static
修饰的函数,static 成员函数对外是隐藏的,你可能在原先时候没有用到static函数,可以调用哪个lib,
而后面你用到了那个库里面的static 成员函数,所以报你说的错,完全合理。

[/Quote]
补充下,建议你打开那个.h文件查看下,你代码里面是否是调用到static成员函数,确认我说的是否是正确的。
feifanup 2009-11-04
  • 打赏
  • 举报
回复
正是因为你检查了n遍,
看太多次了,看得把错的当对的了

所以还是出去转一会儿吧~~~~
或者去便便
回来肯定能发现问题!!
skyworld2288 2009-11-04
  • 打赏
  • 举报
回复
如果原先没有问题的话,我猜想那个包含在include文件里面声明的函数是否有static
修饰的函数,static 成员函数对外是隐藏的,你可能在原先时候没有用到static函数,可以调用哪个lib,
而后面你用到了那个库里面的static 成员函数,所以报你说的错,完全合理。
波特王子 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lianshaohua 的回复:]
大小写的问题,参数问题。。。。汗汗的。。。。。。
[/Quote]
检查过n遍了,没问题啊
ztenv 版主 2009-11-04
  • 打赏
  • 举报
回复
大小写的问题,参数问题。。。。汗汗的。。。。。。
波特王子 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lianshaohua 的回复:]
编译顺序,依赖关系,路径,导出类是否标识为导出?等等吧,
[/Quote]
这些都没问题的,因为导出的类在几个不同工程中运行通过了
波特王子 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 feifanup 的回复:]
出去抽根烟, 嘘嘘下.
回来把库工程编译下,copy出lib和h
再试一下.
看看是不是在代码中写的lib,而在项目属性中又引用了之前没这个函数的lib
[/Quote]
我觉得好像不是这个问题,上次碰到这个问题时是在这里添加stlport才解决的:
工具->选项->项目和解决方案->VC++目录
我这个好像跟error LNK2019: unresolved external symbol没有关系的,感觉特别诡异
ztenv 版主 2009-11-04
  • 打赏
  • 举报
回复
编译顺序,依赖关系,路径,导出类是否标识为导出?等等吧,
feifanup 2009-11-04
  • 打赏
  • 举报
回复
出去抽根烟, 嘘嘘下.
回来把库工程编译下,copy出lib和h
再试一下.
看看是不是在代码中写的lib,而在项目属性中又引用了之前没这个函数的lib
波特王子 2009-11-04
  • 打赏
  • 举报
回复
那必须啊,新建一个工程都已经运行通过,就是在原来的工程中不行

[Quote=引用 1 楼 jackyjkchen 的回复:]
确定是lib里的函数?
[/Quote]
jackyjkchen 2009-11-04
  • 打赏
  • 举报
回复
确定是lib里的函数?

64,646

社区成员

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

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