我编写运行一个OpenGL例程时,调用别人编写的gltTransformPoint方法,出错说:ransform.obj : error LNK2001: unresolved external symbol "void __cdecl gltTransformPoint(float const * const,float const * const,float * const)" (?gltTransformPoint@@YAXQBM0QAM@Z)
这个方法是在GLTools.h中定义的,我在程序开头也包含了进去:
#include "../Common/OpenGLSB.h"
#include "../Common/GLTools.h"(路径是绝对正确的)
到GLTools.h一看,里面只是有个函数声明void gltTransformPoint(const GLTVector3 vSrcPoint, const GLTMatrix mMatrix, GLTVector3 vPointOut);
那具体的函数定义代码在哪儿呢?这是我学C++一大困惑的地方,好多头文件都只是有个声明没见具体代码,还有,这个问题该怎么解决?让程序能找到gltTransformPoint,请教大家了
好像是缺少lib文件,可是我该怎么知道gltTransformPoint函数在哪个lib文件里呢?有请赐教
C++ 头文件中声明的函数都是在哪儿定义的?
答案:6 悬赏:50 手机版
解决时间 2021-03-08 05:03
- 提问者网友:雪舞兮
- 2021-03-07 10:54
最佳答案
- 五星知识达人网友:舊物识亽
- 2021-03-07 11:17
1、函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这三个元素被称为函数原型,函数原型描述了函数的接口。定义函数的程序员提供函数原型,使用函数的程序员就只需要对函数原型编辑即可。
2、比如: 【返回类型】 函数名(参数1类型 参数1,参数2类型 参数2,……);
实例:bool swap(int a,int b);
例子中函数的返回类型为bool型,两个参数都是int型,一个名称为a ,一个名称为b
函数声明中的形参名往往被忽略,如果声明中提供了形参的名字,也只是用作辅助文档。另外要注意函数声明是一个语句,后面不可漏分号!
如果是自己写的函数,在声明函数的同时要对函数进行定义。
假设头文件名为head.h,源文件名为main.cpp,两个文件在同一个目录下
在头文件中直接加上int swap(int a,int b);这一句就可以了
在源文件中还要加上include"head.h"
并且加上函数的定义:
bool swap(int a,int b){//swap函数用于两个数据交换
int c;
c=a;
a=b;
b=c;
}
注意在头文件中声明后记得在源文件中包含这个头文件,要不然是找不到函数的定义的。
2、比如: 【返回类型】 函数名(参数1类型 参数1,参数2类型 参数2,……);
实例:bool swap(int a,int b);
例子中函数的返回类型为bool型,两个参数都是int型,一个名称为a ,一个名称为b
函数声明中的形参名往往被忽略,如果声明中提供了形参的名字,也只是用作辅助文档。另外要注意函数声明是一个语句,后面不可漏分号!
如果是自己写的函数,在声明函数的同时要对函数进行定义。
假设头文件名为head.h,源文件名为main.cpp,两个文件在同一个目录下
在头文件中直接加上int swap(int a,int b);这一句就可以了
在源文件中还要加上include"head.h"
并且加上函数的定义:
bool swap(int a,int b){//swap函数用于两个数据交换
int c;
c=a;
a=b;
b=c;
}
注意在头文件中声明后记得在源文件中包含这个头文件,要不然是找不到函数的定义的。
全部回答
- 1楼网友:舊物识亽
- 2021-03-07 16:32
只包含了头文件?
是不是缺少 .lib 的文件
- 2楼网友:猎心人
- 2021-03-07 15:53
定义只能有一次,而声明的次数不限。任何标识符在使用前至少要有声明,将声明放在头文件中,就可以在需要使用到标识符时随时把头文件包含进来即可。如果把定义放进头文件中,那每包含一次头文件,标识符就定义了一次,这样在多文件的编译连接时很容易出问题的。 包含其实就相当于把被包含文件的内容加入到其中,和用被包含文件中的内容替换掉对应的包含语句没有区别。使用头文件的好处就是免除了重复劳动的麻烦。 反正最终编译器都是把被包含文件的内容合并到一块才编译的。所以这样,lz觉得运行时的调用跟调用任何一个函数有区别吗。
- 3楼网友:往事隔山水
- 2021-03-07 14:37
对于Windows系统函数来说,你查MSDN的时候都可以找到函数所在的头文件和所需要的库,如果用别人写的函数话必须明确在那个库。。。或者看有没有帮助文档的。。。。。
- 4楼网友:琴狂剑也妄
- 2021-03-07 13:51
你奴既然是调用别人编写的gltTransformPoint方法,那么应该将别人的库文件一起拷到你的工程里面,这样连接的时候才不会发生找不到函数定义的情况。
openGL的方法一般是由两类文件组成,头文件和库文件,头文件用来声明函数原型,库文件是函数定义。
再检查一下,是否少拷了一个库文件。
- 5楼网友:拾荒鲤
- 2021-03-07 12:11
这不是编译错误,这是连接错误。
第一种可能:
你先去工程目录下面看有没有lib文件,有的话就用这个指令加进去:
#pragma comment( lib,"lib文件名" )
加在这两个头文件后面。
比如:
#pragma comment( lib,"glut32.lib" )
#pragma comment( lib,"glut.lib" )
第二:
看看commom/目录下面是否有对应的OpenGLSb.cpp、Gltools.cpp文件,如果有的话,就添加到工程里边来。
----------------------------------------------------
这需要查询相关文档。
不过通常如果不是系统库的话都可以在安装的SDK下面的Lib目录下找到lib文件,在bin目录下找到相关的dll文件。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯