我有3个文件: main.cpp , gp_frame.cpp 和 gp_frame.h 。我希望在 gp_frame.h 中声明一个类(名为gp_frame)并在 gp_frame.cpp 中定义成员函数,并希望在 main.cpp中使用该类
概括地说,这三个文件:
/*main.cpp*/
#include "gp_frame.h"
void plotpicture(unsigned int a, unsigned int b, unsigned int c, unsigned int d, unsigned int e){
anita.wait_enter("Some string\n");
}
int main(){
gp_frame anita(true);
plotpicture(1,2,3,4);
return 0;
}
/*gp_frame.h*/
class gp_frame{
public: void wait_enter(std::string uzi);
gp_frame();
gp_frame(bool isPersist);
};
/*gp_frame.cpp*/
#include "gp_frame.h"
void gp_frame::wait_enter(std::string uzi){
/*Some of code*/
}
gp_frame::gp_frame(){
/*Some of code*/
}
gp_frame::gp_frame(bool isPersist){
/*Some of code*/
}
然后,我想编译并链接文件:
g++ -c main.cpp -w -Wall
g++ -c gp_frame.cpp -w -Wall
g++ gp_frame.o main.o -o Myprogram
一切正常。但是,如果我想声明/定义函数 wait_enter 为inline
,如:
/*in gp_frame.h*/
public: inline void wait_enter(std::string uzi);
/*in gp_frame.cpp*/
inline void gp_frame::wait_enter(std::string uzi){
/*Some of code*/
}
编译器也可以工作,但链接器会抛出一个错误:
main.o: In function `plotpicture(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)':
main.cpp:(.text+0x2c6b): undefined reference to `gp_frame::wait_enter(std::string)'
collect2: error: ld returned 1 exit status
你能解释我如何解决问题或者我错在哪里吗?
可悲的是,extern inline
和static inline
都没有解决我的问题。
答案 0 :(得分:3)
我错了什么?
您声明了一个内联函数gp_frame::wait_enter(std::string)
,但是您没有在使用该标准所需函数的所有编译单元(源文件)中定义该函数。
特别是,您只在gp_frame.cpp
中定义了该功能,但未在main.cpp
中定义,即使您使用main.cpp
中的功能。
如何解决问题
在使用它们的所有编译单元中定义内联函数。这样做的惯用方法是在同样的标题中定义它们,并在这种情况下声明它们(在这种情况下为gp_frame.h
)。