如何使用gcc/g++编译多个cpp文件头文件
How to compile multiple cpp file header file using gcc/g++?
我正在尝试编译多个.cpp和.h文件。但它显示了错误。
我的文件是:
应用程序窗口.cpp
#include "ApplicationWindow.h"
void ApplicationWindow::DrawContents ()
{
GetView()->DrawOn(this);
}
应用程序窗口.h
#ifndef APPLICATION_WINDOW_H
#define APPLICATION_WINDOW_H
#include "Window.h"
class ApplicationWindow : public Window
{
public:
// ...
virtual void DrawContents();
};
#endif /* APPLICATION_WINDOW_H */
窗口.h
#ifndef WINDOW_H
#define WINDOW_H
#include "View.h"
class Point;
class WindowImp;
class Window {
public:
Window(View* contents);
// requests handled by window
virtual void DrawContents();
virtual void Open();
virtual void Close();
virtual void Iconify();
virtual void Deiconify();
// requests forwarded to implementation
virtual void SetOrigin(const Point& at);
virtual void SetExtent(const Point& extent);
virtual void Raise();
virtual void Lower();
virtual void DrawLine(const Point&, const Point&);
virtual void DrawRect(const Point&, const Point&);
virtual void DrawPolygon(const Point[], int n);
virtual void DrawText(const char*, const Point&);
protected:
WindowImp* GetWindowImp();
View* GetView();
private:
WindowImp* _imp;
View* _contents; // the window's contents
};
#endif /* WINDOW_H */
Window.cpp
#include "Window.h"
#include "WindowImp.h"
#include "WindowSystemFactory.h"
void Window::DrawRect (const Point& p1, const Point& p2) {
WindowImp* imp = GetWindowImp();
imp->DeviceRect(p1.X(), p1.Y(), p2.X(), p2.Y());
}
WindowImp* Window::GetWindowImp () {
if (_imp == 0) {
_imp = WindowSystemFactory::Instance()->MakeWindowImp();
}
return _imp;
}
视图.h
#ifndef VIEW_H
#define VIEW_H
class ApplicationWindow;
class View {
public:
void DrawOn(const ApplicationWindow* w) const;
};
#endif /* VIEW */
查看.cpp
#include "View.h"
#include <iostream>
using namespace std;
void View::DrawOn(const ApplicationWindow* w) const
{
cout << "DrawOn(" << w << ")" << endl;
}
我也有WindowImp.h和WindowSystemFactory.h文件。
我尝试了从其他stackoverflow
答案中找到的所有方法(使用G++编译多个.cpp和.h文件.
但它显示了以下错误:
"Window::DrawPolygon(Point const*, int)", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::Open()", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::Close()", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::Lower()", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::Raise()", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::GetView()", referenced from:
ApplicationWindow::DrawContents() in ApplicationWindow.o
"Window::Iconify()", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::DrawLine(Point const&, Point const&)", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::DrawRect(Point const&, Point const&)", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::DrawText(char const*, Point const&)", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::Deiconify()", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::SetExtent(Point const&)", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"Window::SetOrigin(Point const&)", referenced from:
vtable for ApplicationWindow in ApplicationWindow.o
"View::DrawOn(ApplicationWindow const*) const", referenced from:
ApplicationWindow::DrawContents() in ApplicationWindow.o
"typeinfo for Window", referenced from:
typeinfo for ApplicationWindow in ApplicationWindow.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
还有我的g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
我使用的是Mac OSX 10.9.4。我知道这是上面提到的答案的重复,但我仍然无法解决。如果有人帮助我,对我来说会很好。
我只需要运行g++ ApplicationWindow.cpp
文件,就不会出现上述错误。但是我试着用上面粘贴的链接中提到的方式链接所有其他.cpp和.h文件。提前感谢。。。。
您在Window中声明了许多虚拟函数。头,但您没有定义任何实现。
您可以编译每个.cpp文件,因为其中没有语法错误。但是,链接器找不到您正在声明的函数,因此无法生成可执行文件。
http://www.parashift.com/c++-faq/link-errs-missing-vtable.html
只需先隐藏所有未使用且未定义的虚拟函数,然后重试。(或者添加空的实现)
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 为什么我的主文件.cpp不打印头文件中的任何内容
- 生成文件错误 - 找不到文件 - *.cpp
- 如何在文件.cpp gtkmm中声明小部件
- 没有实现文件(.cpp)的派生类
- 如何使用"CMakeLists.txt"中的add_library将整个文件(.cpp,.h等)包含在目录中
- 如何在Linux / Windows操作系统上使用文件*.cpp一步编译下面的代码
- 关于 Linux .so 文件无法链接到主文件.cpp文件
- 文件.cpp从Windows到Linux
- Ubuntu C++ 编译器错误: g++: 错误: 文件.cpp: 没有这样的文件或目录
- 如何将文件.cpp编译为本机编译
- 使用模板类时,似乎无法包含除 main 以外的任何 cpp 文件.cpp
- 无法编译C++文件.cpp。C++98模式
- 为什么C++头文件不需要包含实现文件 (.cpp)
- 如何访问位于独立文件(.cpp)中的非成员函数
- 如何在Visual Studio Code中通过键盘快捷键切换头文件/cpp文件
- 如何将数据从stringstream写入文件(CPP)
- 为什么filestream不把空白写入文件cpp ?