注册 登录
编程论坛 C++教室

C++程序,编译没有问题,连接时出错,这是怎么回事?

碧海苍梧 发布于 2013-10-29 12:02, 1171 次点击
Linking...
test.obj : error LNK2001: unresolved external symbol "void __cdecl getVolumn(void)" (?getVolumn@@YAXXZ)
test.obj : error LNK2001: unresolved external symbol "void __cdecl inputVolumn(void)" (?inputVolumn@@YAXXZ)
Debug/我的程序.exe : fatal error LNK1120: 2 unresolved externals
执行 link.exe 时出错.


这是出错的提示信息,哪位高手能帮忙看看这个怎么解决啊,谢谢了啊1
29 回复
#2
peach54602013-10-29 12:19
你去翻一下字典,告诉我出错信息提示你什么...
#3
nba1990442013-10-29 12:21
把源码贴出来看看
#4
碧海苍梧2013-10-29 12:22
回复 2楼 peach5460
看不懂啊,我的英文也不好,单个词查出来意思拼到一起不通顺啊
#5
碧海苍梧2013-10-29 12:28
回复 3楼 nba199044
我的是多文件
Circle.cpp
#include<iostream>
using namespace std;
float Radius;
#define PI 3.14
void InputRadius()
{
    cout<<"请输入圆的半径:";
    cin>>Radius;
}
void GetCircleArea()
{
    cout<<"输出圆的面积:"<<Radius*Radius*PI<<endl;
}

Rect.cpp
#include<iostream>
using namespace std;
float fRectW;
float fRectH;
void InputRectWH()
{
    cout<<"请输入矩形的长:";
    cin>>fRectW;
    cout<<"请输入矩形的宽:";
    cin>>fRectH;
}
void GetRectArea()
{
    cout<<"矩形的面积="<<fRectW*fRectH<<endl;

}

recevalum.cpp
#include<iostream>
using namespace std;
struct rectVolumn
{
    int length;
    int width;
    int height;
    int volumn;
};


void inputVolumn(rectVolumn *rv)
{

    cout<<"请输入长方体的长:";
    cin>>(*rv).length;
    cout<<"请输入长方体的宽:";
    cin>>(*rv).width;
    cout<<"请输入长方体的高:";
    cin>>(*rv).height;

}

void getVolumn(rectVolumn *rv)
{
cout<<"长方体的体积="<<(*rv).length*(*rv).width*(*rv).height<<endl;
}

test.cpp
#include<iostream>
#include"Circle.h"
#include"Rect.h"
#include"rectvalum.h"
using namespace std;

int main()
{
    InputRadius();
    GetCircleArea();

    InputRectWH();
    GetRectArea();

   
    rectVolumn *rv;
    rv=new rectVolumn;
    inputVolumn();
    getVolumn();
    delete rv;


    return 0;
}

Circle.h
void InputRadius();
void GetCircleArea();

Rect.h
void InputRectWH();
void GetRectArea();

rectvalum.h
struct rectVolumn
{
    int length;
    int width;
    int height;
    int volumn;
  
}*rv;
void inputVolumn();
void getVolumn();
#6
blueskiner2013-10-29 12:34
在Circle.cpp最顶上加上#include "Rect.h"..等等你那些个头文件
#7
碧海苍梧2013-10-29 12:36
回复 6楼 blueskiner
没听懂您说的什么意思,可不可以麻烦您说的清楚一点,加在哪一个文件中啊
#8
i802862013-10-29 12:59
程序可读性太差,把所有需定义的函数和变量(包括类)都放在一个头文件中,然后在所有的CPP文件中都添加你所定义的头文件
#9
碧海苍梧2013-10-29 13:02
回复 8楼 i80286
我们老师让我们练习创建多文件的C++程序,所以才写成这个样子的
#10
blueskiner2013-10-29 13:03
很不错。老师在训练你们分模块编码呢。
#11
i802862013-10-29 13:06
回复 9楼 碧海苍梧
没错啊,一个主程序main,一个头文件.h,然后N个.CPP子程序,N个子程序和主程序都引用你写的头文件
#12
碧海苍梧2013-10-29 13:07
回复 10楼 blueskiner
但是我这个错误怎么解决啊?
#13
碧海苍梧2013-10-29 13:09
回复 11楼 i80286
编译的时候没有错误,但是连接的时候就有错误了
#14
i802862013-10-29 13:22
这是你定义的函数:
void inputVolumn(rectVolumn *rv)
void getVolumn(rectVolumn *rv)
这是你在主函数中引用的语句:
inputVolumn();
getVolumn();
错误你应该明白了吧?
#15
碧海苍梧2013-10-29 13:30
回复 14楼 i80286
我把定义改成
void inputVolumn()
void getVolumn()

连接时错误提示
Linking...
test.obj : error LNK2005: "struct rectVolumn * rv" (?rv@@3PAUrectVolumn@@A) already defined in rectvalum.obj
Debug/我的程序.exe : fatal error LNK1169: one or more multiply defined symbols found
执行 link.exe 时出错.

主函数引用改成
    inputVolumn(rectVolumn *rv);
    getVolumn(rectVolumn *rv);
编译的时候直接就出错了
test.cpp
E:\大三上学期\C++\实验二\我的2\我的程序\我的程序\test.cpp(18) : error C2275: 'rectVolumn' : illegal use of this type as an expression
        e:\大三上学期\c++\实验二\我的2\我的程序\我的程序\rectvalum.h(2) : see declaration of 'rectVolumn'
E:\大三上学期\C++\实验二\我的2\我的程序\我的程序\test.cpp(18) : error C2660: 'inputVolumn' : function does not take 1 parameters
E:\大三上学期\C++\实验二\我的2\我的程序\我的程序\test.cpp(19) : error C2275: 'rectVolumn' : illegal use of this type as an expression
        e:\大三上学期\c++\实验二\我的2\我的程序\我的程序\rectvalum.h(2) : see declaration of 'rectVolumn'
E:\大三上学期\C++\实验二\我的2\我的程序\我的程序\test.cpp(19) : error C2660: 'getVolumn' : function does not take 1 parameters
执行 cl.exe 时出错.
#16
TonyDeng2013-10-29 13:35
既然老師要訓練你寫多模塊程序,應該有指導怎麽弄的。你先把程序寫在一個模塊中,調試通過之後再把需要分模塊的部分切割出去,很簡單的,不知道你老師沒具體指導你還是怎地。
#17
i802862013-10-29 13:43
recevalum.cpp
 #include<iostream>
 using namespace std;

 struct rectVolumn
 {
     int length;
     int width;
     int height;
     int volumn;
 };
rectVolumn rv;

void inputVolumn()
 {
     cout<<"请输入长方体的长:";
     cin>>rv.length;
     cout<<"请输入长方体的宽:";
     cin>>rv.width;
     cout<<"请输入长方体的高:";
     cin>>rv.height;
 }

 void getVolumn()
 {
 cout<<"长方体的体积="<<rv.length*rv.width*rv.height<<endl;
}
#18
碧海苍梧2013-10-29 13:50
回复 16楼 TonyDeng
前两个放到一起的时候没有出错,第三个求长方体体单独放在一个文件中时也没有错,但是,把它和前两个合到一起,也就是我前面发的代码,这个时候就有错误了
#19
碧海苍梧2013-10-29 13:57
回复 17楼 i80286
可以了啊,您能告诉我这是怎么回事吗?
#20
TonyDeng2013-10-29 13:59
把要分割出去的函數搬到另一個.cpp模塊(這個模塊不需要原型聲明,但若.h中有數據類型定義或宏之類東西,就要#include後面的.h)中,然後把這些函數的原型聲明搬到另一個.h頭文件中,在原先的程序中#include這個.h,然後在project中把前面的.cpp引用起來,編譯即可。鏈接找不到函數的實現代碼,是因爲project中沒有要求鏈接對應的.cpp文件,那個才是頭的實現部分,.h是拿出去給外人看的清單,祇有.h是沒用的(很多人總說要.h之類,明顯就是不懂C/C++的多模塊編程是怎麽回事)。
#21
i802862013-10-29 14:11
回复 19楼 碧海苍梧
函数在定义和引用时,参数类型要保持一致,编译系统不会自动调整这种错误的.
建议你重写
#22
碧海苍梧2013-10-29 14:21
回复 21楼 i80286
我原先的不也一致吗?但是,你改了几个地方就可以了。你把我rectvalum中的指针给删了,那主函数中的rectVolumn *rv;为什么没有出错啊?
#23
i802862013-10-29 14:30
回复 22楼 碧海苍梧
1、主函数的定义我没有看出有什么实际意义,你删掉也应该不会影响结果
2、函数中的参数是指()内的内容,如果只是一个空(),那就是告诉编译器,不传递参数,反之,在运用函数时就应该传递相同类型的参数


#24
碧海苍梧2013-10-29 14:38
回复 23楼 i80286
删除主函数 rectVolumn *rv;在编译的时候就出错了,出错信息:

test.cpp
E:\大三上学期\C++\实验二\我的2\我的程序\我的程序\test.cpp(17) : error C2065: 'rv' : undeclared identifier
E:\大三上学期\C++\实验二\我的2\我的程序\我的程序\test.cpp(17) : error C2440: '=' : cannot convert from 'struct rectVolumn *' to 'int'
        This conversion requires a reinterpret_cast, a C-style cast or function-style cast
E:\大三上学期\C++\实验二\我的2\我的程序\我的程序\test.cpp(20) : error C2541: delete : cannot delete objects that are not pointers
执行 cl.exe 时出错.
#25
期待追忆2013-10-30 09:34
好吧!感觉好麻烦的样子写个体积要写这么多吗?多文件只要会用就行了
#26
peach54602013-10-30 10:03
没想到帖子刷得还蛮快的,瞬间刷了三页...

底下的回复内容懒得看了...
楼主的问题无非就是.h的声明没找到.cpp的函数定义,所以出现了无法访问的外部符号...
#27
peach54602013-10-30 10:31
以下是引用碧海苍梧在2013-10-29 12:22:20的发言:

看不懂啊,我的英文也不好,单个词查出来意思拼到一起不通顺啊

看不懂,就去想方设法弄懂
而不是心安理得的等着别人来告诉你...
#28
碧海苍梧2013-10-30 21:35
回复 27楼 peach5460
好吧,谢谢
#29
碧海苍梧2013-10-30 21:36
回复 25楼 期待追忆
这个是老师的要求
#30
blueskiner2013-10-30 22:26
以下是引用peach5460在2013-10-30 10:31:32的发言:


看不懂,就去想方设法弄懂
而不是心安理得的等着别人来告诉你...

+1,版主这个说得很有道理,当初我自学的时候也是经常用搜索引擎寻找答案,不是等着谁来告诉。
1