简体   繁体   English

如何使用gcc / g ++编译多个cpp文件头文件?

[英]How to compile multiple cpp file header file using gcc/g++?

i am trying to compile multiple .cpp and .h file. 我正在尝试编译多个.cpp和.h文件。 But it show error. 但是它显示错误。

My files are: 我的文件是:

ApplicationWindow.cpp ApplicationWindow.cpp

#include "ApplicationWindow.h"

void ApplicationWindow::DrawContents ()
{
  GetView()->DrawOn(this);
}

ApplicationWindow.h ApplicationWindow.h

#ifndef APPLICATION_WINDOW_H
#define APPLICATION_WINDOW_H

#include "Window.h"

class ApplicationWindow : public Window
{
public:
    // ...
    virtual void DrawContents();
};

#endif /* APPLICATION_WINDOW_H */

Window.h 在window.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 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;
}

View.h View.h

#ifndef VIEW_H
#define VIEW_H

class ApplicationWindow;

class View {
public:
    void DrawOn(const ApplicationWindow* w) const;
};

#endif /* VIEW */

View.cpp View.cpp

#include "View.h"
#include <iostream>
using namespace std;

void View::DrawOn(const ApplicationWindow* w) const
{
    cout << "DrawOn(" << w << ")" << endl;
}

both WindowImp.h and WindowSystemFactory.h file also i have. 我也有WindowImp.h和WindowSystemFactory.h文件。

I tried in all the way which is i found from other stackoverflow answers ( Using G++ to compile multiple .cpp and .h files . 我尝试了从其他stackoverflow答案中找到的所有方法( 使用G ++编译多个.cpp和.h文件

But it show the following error: 但它显示以下错误:

"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)

And my g++ --version 还有我的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

I am using Mac OSX 10.9.4. 我正在使用Mac OSX 10.9.4。 I know this is duplicate of above mentioned answer, but still i not able to solve. 我知道这是上述答案的重复,但仍然无法解决。 If any one help me it will great to me. 如果有人帮助我,那对我会很好。

I have to just run g++ ApplicationWindow.cpp file without above error. 我只需要运行g++ ApplicationWindow.cpp文件而不会出现上述错误。 but i tried to link all other .cpp and .h file the way mentioned in answer of above the link which i pasted over here. 但是我试图以上面我粘贴在这里的链接的答案中提到的方式链接所有其他.cpp和.h文件。 Thank in advance.... 预先感谢....

You declare a lot of virtual functions in your Window. 您在Window中声明了许多虚函数。 header but you are not defining any implementations. 标头,但您没有定义任何实现。

You can compile each .cpp file since there are no syntax errors in there. 您可以编译每个.cpp文件,因为其中没有语法错误。 However the linker can't find the functions you are declaring and can't produce an executable as a result. 但是,链接器找不到您要声明的函数,因此无法生成可执行文件。

http://www.parashift.com/c++-faq/link-errs-missing-vtable.html http://www.parashift.com/c++-faq/link-errs-missing-vtable.html

Simply start by hiding all the virtual functions you are not using and not defining then try again. 只需从隐藏所有未使用的虚拟函数开始,然后再定义即可,然后重试。 (Or add empty implementations to them) (或向其中添加空的实现)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM