为啥会出error LNK2001: Unsolved external symbol ?

crazypeter2005 2008-03-07 02:10:07
有2个问题
1
在头文件里面声明1个结构体
LSQAStat.h

struct _RunStatusInfo
{
int Index; //operation type index
SVTString tstName; //tstName ---most common operations
int count; //loop
float sum; //response time sum
float min; //min response time
float max; //max response time
float sleep; //sleep time(unused)
int err_cnt; //error counter
int exec_cnt; //executr counter
} ;

然后在CPP文件里面
首先
struct _RunStatusInfo statusinfo[20];//20种不同但类似的操作.

再LSQAStat::LSQAStat(void)
{
//初始化该结构体就不会出错,
}

但是如果我想把struct _RunStatusInfo statusinfo[20];放进该构造函数就会抛
error LNK2001: Unsolved external symbol "struct_RuinStatusInfo *statusInfo" ......
fatal error Link1120:1 unresolved externals

这个是咋回事呢?

2 我如何起LSQAStat为1个且仅仅1个Instance,每隔10分钟起来读该结构体数组,并且写入文件(可能需要加锁?),写点别的进程来不断更改statusinfo[20]的每个结构体数组的值.
为了能在别的进程源码里面取的那些count/max等值,我该如何设计LSQAStat这个类以及
statusinfo[20]这个结构体?
这个LSQAStat就是为了能定时把一些统计信息取出来而设计的.

大家帮忙给点建议啊?
...全文
530 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
野男孩 2008-03-08
  • 打赏
  • 举报
回复
还有lz开始说的一放进类里面初始化就链接失败,不知道你是怎么写的代码,不好说咋回事~
野男孩 2008-03-08
  • 打赏
  • 举报
回复
看起来lz没用弄清楚声明和定义的区别。

在CPP文件顶部定义个结构,那就是只有这一份结构体分配了内存。要是放在成员变量里,如果不声明成静态的,每个类的实例就有一份结构体分配了内存。

如果把LQAStat实现为Singleton,可以保证只有一个访问点。

多个进程如果都要读取该结构体,如果这些进程都在同一个机器上运行,那么使用内存映射要好一些。稍微做点同步处理就行了。
crazypeter2005 2008-03-07
  • 打赏
  • 举报
回复
用静态变量会造成内存泄露吗?
是指析构函数没写好,没有回收这些静态变量?
crazypeter2005 2008-03-07
  • 打赏
  • 举报
回复
有点明白了,
类似于以下的代码
程序如下:

程序文件1:
#include <iostream>
int n = 8;
void f();
int main(){
std::cout < <n < <"\n";
f();
}

程序文件2:
#include <iostream>

int n;
void f(){
std::cout < <n < <"\n";
}

输出内容为:
8
0

我的statusinfo[20]是在LSQAStat的H和CPP文件中声明和赋初值的,
但是在A和B中分别实例化了 ,或许我该把statusinfo[20]声明为静态的??
大侠们给点答复啊?
crazypeter2005 2008-03-07
  • 打赏
  • 举报
回复
class A//A只做A操作
{
run test1;
if (pass)
logPerfFile << " *TIME* TO PERFORM " << actionName << " " << elapsedTime << endl;
statusinfo[0].avg = LSQAStat->getavg(elapsedTime);//取新的均值
statusinfo[0].exec_cnt++;


else
logERRORFile << " ERROR PERFORM " << actionName << " " << elapsedTime << endl;
statusinfo[0].err_cnt++;
}

class B//B只做B操作
{
run test1;
if (pass)
logPerfFile << " *TIME* TO PERFORM " << actionName << " " << elapsedTime << endl;
statusinfo[1].avg = LSQAStat->getavg(elapsedTime);//取新的均值
statusinfo[1].exec_cnt++;


else
logERRORFile << " ERROR PERFORM " << actionName << " " << elapsedTime << endl;
statusinfo[1].err_cnt++;
}

在外边有个Runcases方法可以取count(执行了几轮)
statusinfo[0]只有A操作
statusinfo[1]只有B操作

我该如何设计LSQAStat类和statusinfo[20]这个结构体呢?

别的打文件和锁的事情再说吧?

问题是我不想出现多份statusinfo[20],只想要1份.
crazypeter2005 2008-03-07
  • 打赏
  • 举报
回复
象我这样把struct _RunStatusInfo statusinfo[20];//20种不同但类似的操作.
声明在构造函数外边,是不是所有的类都可以更改这个数组啊?我只想拥有1份struct _RunStatusInfo statusinfo[20]
那又该如何定义呢?
把这个数组定义为LSQAStat的成员?
那么我定义LSQAStat为SingleTon的话,是不是在A.h中#include "LSQAStat.h",然后在A.cpp中struct _RunStatusInfo statusinfo[20]就只有1份?

还有就是我有个别的类A,在A.h中#include "LSQAStat.h",然后在A.cpp中DMQAStat* qastat;
同时在B.h中#include "LSQAStat.h",然后在B.cpp中DMQAStat* qastat
那我的struct _RunStatusInfo statusinfo[20]就会出现2份?
Supper_Jerry 2008-03-07
  • 打赏
  • 举报
回复
问题1.类还没有定义完成怎么可能用来定义变量?
所以出错了。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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