所以在正确的.cc文件中实现了所有虚拟功能后,我仍然无法使程序成功编译。这是实现文件:
#include "rd_direct.h"
#include "rd_error.h"
#include <string>
using std::string;
//General Functions
int rd_display(const string & name, const string & type, const string & mode)
{
return RD_OK;
}
int rd_format(int xresolution, int yresolution)
{
return RD_OK;
}
int rd_world_begin(void)
{
return RD_OK;
}
int rd_world_end(void)
{
return RD_OK;
}
int rd_frame_begin(int frame_no)
{
return RD_OK;
}
int rd_frame_end(void)
{
return RD_OK;
}
int rd_render_init(void)
{
return RD_OK;
}
int rd_render_cleanup(void)
{
return RD_OK;
}
/**********Camera*************************/
int rd_camera_eye(const float eyepoint[3])
{
return RD_OK;
}
int rd_camera_at(const float atpoint[3])
{
return RD_OK;
}
int rd_camera_up(const float up[3])
{
return RD_OK;
}
int rd_camera_fov(float fov)
{
return RD_OK;
}
int rd_clipping(float znear, float zfar)
{
return RD_OK;
}
/********************** Transformations **********************************/
int rd_translate(const float offset[3])
{
return RD_OK;
}
int rd_scale(const float scale_factor[3])
{
return RD_OK;
}
int rd_rotate_xy(float angle)
{
return RD_OK;
}
int rd_rotate_yz(float angle)
{
return RD_OK;
}
int rd_rotate_zx(float angle)
{
return RD_OK;
}
int rd_matrix(const float * mat)
{
return RD_OK;
}
int rd_xform_push(void)
{
return RD_OK;
}
int rd_xform_pop(void)
{
return RD_OK;
}
/********************** Geometric Objects *******************************/
int rd_bezier_curve(const string & vertex_type,
int degree, const float * vertex)
{
return RD_OK;
}
int rd_bezier_patch(const string & vertex_type,
int u_degree, int v_degree,
const float * vertex)
{
return RD_OK;
}
int rd_catmull_clark_sds(const string & vertex_type,
float * coord, int nvertex,
int * vertex_list, int nface,
int * crease_list, int ncrease,
float *sharpness)
{
return RD_OK;
}
int rd_circle(const float center[3], float radius)
{
return RD_OK;
}
int rd_line(const float start[3], const float end[3])
{
return RD_OK;
}
int rd_lineset(const string & vertex_type,
int nvertex, const float * vertex,
int nseg, const int * seg)
{
return RD_OK;
}
int rd_point(const float p[3])
{
return RD_OK;
}
int rd_pointset(const string & vertex_type,
int nvertex, const float * vertex)
{
return RD_OK;
}
int rd_polyset(const string & vertex_type,
int nvertex, const float * vertex,
int nface, const int * face)
{
return RD_OK;
}
int rd_cone(float height, float radius, float thetamax)
{
return RD_OK;
}
int rd_cube(void)
{
return RD_OK;
}
int rd_cylinder(float radius, float zmin,
float zmax, float thetamax)
{
return RD_OK;
}
int rd_disk(float height, float radius, float theta)
{
return RD_OK;
}
int rd_hyperboloid(const float start[3], const float end[3],
float thetamax)
{
return RD_OK;
}
int rd_paraboloid(float rmax, float zmin,
float zmax, float thetamax)
{
return RD_OK;
}
int rd_sphere(float radius, float zmin, float zmax, float thetamax)
{
return RD_OK;
}
int rd_sqsphere(float radius, float north, float east,
float zmin, float zmax, float thetamax)
{
return RD_OK;
}
int rd_sqtorus(float radius1, float radius2,
float north, float east, float phimin, float phimax,
float thetamax)
{
return RD_OK;
}
int rd_torus(float radius1, float radius2,
float phimin, float phimax, float thetamax)
{
return RD_OK;
}
int rd_tube(const float start[3], const float end[3], float radius)
{
return RD_OK;
}
/******************** Lighting & Shading ***************************/
int rd_background(const float color[])
{
return RD_OK;
}
// red, green, blue by default
int rd_color(const float color[])
{
return RD_OK;
}
int rd_opacity(float opacity)
{
return RD_OK;
}
int rd_emission(const float color[], float intensity)
{
return RD_OK;
}
int rd_fill(const float seed_point[3])
{
return RD_OK;
}
int rd_surface(const string & shader_type)
{
return RD_OK;
}
int rd_cone_light(const float pos[3], const float at[3],
float theta_min, float theta_max,
const float color[], float intensity)
{
return RD_OK;
}
int rd_point_light(const float pos[3],
const float color[], float intensity)
{
return RD_OK;
}
int rd_far_light (const float dir[3],
const float color[], float intensity)
{
return RD_OK;
}
int rd_ambient_light(const float color[], float intensity)
{
return RD_OK;
}
int rd_specular_color(const float color[], int exponent)
{
return RD_OK;
}
int rd_k_ambient(float Ka)
{
return RD_OK;
}
int rd_k_diffuse(float Kd)
{
return RD_OK;
}
int rd_k_emission(float Ke)
{
return RD_OK;
}
int rd_k_specular(float Ks)
{
return RD_OK;
}
int rd_attribute_push(void)
{
return RD_OK;
}
int rd_attribute_pop(void)
{
return RD_OK;
}
int rd_map_border(const string & map_type,
const string & horizontal,
const string & vertical)
{
return RD_OK;
}
int rd_map_bound(const string & map_type,
float s_min, float t_min,
float s_max, float t_max)
{
return RD_OK;
}
int rd_map_load(const string & filename,
const string & label)
{
return RD_OK;
}
int rd_map_sample(const string & map_type,
const string & intra_level,
const string & inter_level)
{
return RD_OK;
}
int rd_map(const string & map_type, const string & label)
{
return RD_OK;
}
/**************************** Options **********************************/
int rd_option_array(const string & name, int n, const float *values)
{
return RD_OK;
}
int rd_option_bool(const string & name, bool flag)
{
return RD_OK;
}
int rd_option_list(const string & name, int n, const string values [])
{
return RD_OK;
}
int rd_option_real(const string & name, float value)
{
return RD_OK;
}
int rd_option_string(const string & name, const string & value)
{
return RD_OK;
}
int rd_custom(const string & label)
{
return RD_OK;
}
这是.cc从中提取的我的.h文件:
#ifndef RD_BASE_ENGINE_H
#define RD_BASE_ENGINE_H
#include <string>
using std::string;
class RenderEngine
{
public:
/********************** General functions *******************************/
virtual int rd_display(const string & name, const string & type,
const string & mode);
virtual int rd_format(int xresolution, int yresolution);
virtual int rd_world_begin(void);
virtual int rd_world_end(void);
virtual int rd_frame_begin(int frame_no);
virtual int rd_frame_end(void);
virtual int rd_render_init(void); /* Initialize renderer */
virtual int rd_render_cleanup(void);
/********************** Camera ******************************************/
virtual int rd_camera_eye(const float eyepoint[3]);
virtual int rd_camera_at(const float atpoint[3]);
virtual int rd_camera_up(const float up[3]);
virtual int rd_camera_fov(float fov);
virtual int rd_clipping(float znear, float zfar);
/********************** Transformations **********************************/
virtual int rd_translate(const float offset[3]);
virtual int rd_scale(const float scale_factor[3]);
virtual int rd_rotate_xy(float angle);
virtual int rd_rotate_yz(float angle);
virtual int rd_rotate_zx(float angle);
virtual int rd_matrix(const float * mat);
virtual int rd_xform_push(void);
virtual int rd_xform_pop(void);
/********************** Geometric Objects *******************************/
virtual int rd_bezier_curve(const string & vertex_type,
int degree, const float * vertex);
virtual int rd_bezier_patch(const string & vertex_type,
int u_degree, int v_degree,
const float * vertex);
virtual int rd_catmull_clark_sds(const string & vertex_type,
float * coord, int nvertex,
int * vertex_list, int nface,
int * crease_list, int ncrease,
float *sharpness);
virtual int rd_circle(const float center[3], float radius);
virtual int rd_line(const float start[3], const float end[3]);
virtual int rd_lineset(const string & vertex_type,
int nvertex, const float * vertex,
int nseg, const int * seg);
virtual int rd_point(const float p[3]);
virtual int rd_pointset(const string & vertex_type,
int nvertex, const float * vertex);
virtual int rd_polyset(const string & vertex_type,
int nvertex, const float * vertex,
int nface, const int * face);
virtual int rd_cone(float height, float radius, float thetamax);
virtual int rd_cube(void);
virtual int rd_cylinder(float radius, float zmin,
float zmax, float thetamax);
virtual int rd_disk(float height, float radius, float theta);
virtual int rd_hyperboloid(const float start[3], const float end[3],
float thetamax);
virtual int rd_paraboloid(float rmax, float zmin,
float zmax, float thetamax);
virtual int rd_sphere(float radius, float zmin, float zmax, float thetamax);
virtual int rd_sqsphere(float radius, float north, float east,
float zmin, float zmax, float thetamax);
virtual int rd_sqtorus(float radius1, float radius2,
float north, float east, float phimin, float phimax,
float thetamax);
virtual int rd_torus(float radius1, float radius2,
float phimin, float phimax, float thetamax);
virtual int rd_tube(const float start[3], const float end[3], float radius);
/******************** Lighting & Shading ***************************/
virtual int rd_background(const float color[]);
// red, green, blue by default
virtual int rd_color(const float color[]);
virtual int rd_opacity(float opacity);
virtual int rd_emission(const float color[], float intensity);
virtual int rd_fill(const float seed_point[3]);
virtual int rd_surface(const string & shader_type);
virtual int rd_cone_light(const float pos[3], const float at[3],
float theta_min, float theta_max,
const float color[], float intensity);
virtual int rd_point_light(const float pos[3],
const float color[], float intensity);
virtual int rd_far_light (const float dir[3],
const float color[], float intensity);
virtual int rd_ambient_light(const float color[], float intensity);
virtual int rd_specular_color(const float color[], int exponent);
virtual int rd_k_ambient(float Ka);
virtual int rd_k_diffuse(float Kd);
virtual int rd_k_emission(float Ke);
virtual int rd_k_specular(float Ks);
virtual int rd_attribute_push(void);
virtual int rd_attribute_pop(void);
/**************************** Mapping ******************************/
virtual int rd_map_border(const string & map_type,
const string & horizontal,
const string & vertical);
virtual int rd_map_bound(const string & map_type,
float s_min, float t_min,
float s_max, float t_max);
virtual int rd_map_load(const string & filename,
const string & label);
virtual int rd_map_sample(const string & map_type,
const string & intra_level,
const string & inter_level);
virtual int rd_map(const string & map_type, const string & label);
/**************************** Options **********************************/
virtual int rd_option_array(const string & name, int n, const float *values);
virtual int rd_option_bool(const string & name, bool flag);
virtual int rd_option_list(const string & name, int n, const string values []);
virtual int rd_option_real(const string & name, float value);
virtual int rd_option_string(const string & name, const string & value);
virtual int rd_custom(const string & label);
virtual ~RenderEngine();
};
// Some useful helper functions
int get_vertex_size(const string & vertex_type);
// Returns the number of components in an attributed vertex type
#endif /* RD_BASE_ENGINE_H */
我已经看到此错误的StackOverflow线程,但这不能解决我的问题。如果有人可以帮助我,那会很棒,因为我很茫然。完整的错误代码在这里:
$ make
g++ -o rd_view -g -Wall libcs631.a rd_direct.o pnm_display.o -lm -lX11
libcs631.a(rd_engine.o):rd_engine.cc:(.rdata$.refptr._ZTV8REDirect[.refptr._ZTV8REDirect]+0x0): undefined reference to `vtable for REDirect'
collect2: error: ld returned 1 exit status
make: *** [Makefile:5: rd_view] Error 1
编辑:这是我的头文件,其中定义了REDirect类:
#ifndef RD_ENGINE_DIRECT_H
#define RD_ENGINE_DIRECT_H
#include "rd_enginebase.h"
#include "rd_error.h"
#include <string>
using std::string;
// This is a rendering engine that renders directly to the image buffer as
// primitives come in. A depth buffer is obviously needed. Transparency is
// not properly handled.
class REDirect: public RenderEngine
{
public:
int rd_display(const string & name, const string & type, const string & mode);
};
#endif /* RD_ENGINE_DIRECT_H */
'''
定义
int rd_display(const string & name, const string & type, const string & mode) { ... }
是一个免费功能。您需要告诉编译器那些功能是某个类的成员的实现:
int RenderEngine::rd_display(const string & name, const string & type, const string & mode) { ... }
因此,只需将RenderEngine::
添加到所有这些功能。
并且也不要忘记实现虚拟析构函数,或将其声明为
virtual ~RenderEngine() = default;
让编译器生成一个。