0

我正在学习在 Linux 中编写 C++,我遇到了以下问题:

我有 4 个文件:main.cpp、model.cpp、view.cpp 和 controller.cpp,每个(除了 main)都有自己的头文件。main.cpp 包括model.h、view.h 和controller.h,view.h 包括仅与它相关的其他库(运行图形库所必需的)。这些库位于不同的文件夹中,并且它们自己有其他依赖项(这就是我不想移动它们的原因)。因此,我的 makefile 如下所示:

model: model.cpp model.h
  g++ -c model.cpp

view: view.cpp view.h
  g++ -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I.. -c view.cpp

controller: controller.cpp
  g++ -c controller.cpp

main: main.cpp
  g++ -c main.cpp

还有一行将所有文件链接在一起(我没有添加它,因为我是在我的 Mac 上编写它并从我的 Raspberry Pi 的屏幕上复制它)。

我的问题是,当我尝试编译它们时,它们都可以工作,除了 main,它告诉我以下内容:

In file included from main.cpp:6:0:
view.h:4:23: fatal error: VG/openvg.h: No such file or directory
compilation terminated.
make: *** [main] Error 1

据我了解,当我用“make view”编译视图时,它可以毫无问题地找到包含的文件,因为它具有它必须查找的路径,但是由于“make main”没有这些路径,它不知道去哪里找openvg.h。问题是,如果我将路径添加到 main,它会告诉我库中有多个定义......有什么帮助吗?

4

3 回答 3

0

#include VG/openvg.h包含在并/opt/vc/include包含在view.h

当你make view包含它时,view.cpp它是用它编译的 -I/opt/vc/include

当您make main包含它时,main.cpp它是在没有标志的情况下编译的,因此它无法找到该文件。

您需要添加标志

main: main.cpp
        g++ -c -I/opt/vc/include main.cpp

您可能还需要其他标志,具体取决于view.h包含的内容。

多重定义是由$(OPENVGLIBDIR)/fontinfo.h

其中包含

Fontinfo SansTypeface, SerifTypeface, MonoTypeface;

因此,如果您将该文件包含在多个目标文件中并链接它们(main.oview.o这种情况下),您将获得多个定义。

将其更改为

extern Fontinfo SansTypeface, SerifTypeface, MonoTypeface;

然后我得到了未定义的背景等,因为 libshapes 是一个 C 库。为了解决这个问题,我改变了

#include "fontinfo.h"
#include "shapes.h"

view.h

extern "C" {
#include "fontinfo.h"
#include "shapes.h"
}

它为我构建(删除了对模型和控制器的引用)。

在您的 makefile 中,视图/模型/控制器/主要目标正在制作.o文件,因此它们也应该.o如此。当你make test.o存在时,它正在寻找.o目标。如果您的 makefile 中没有,它将使用默认的直接g++ -c.

你的 make 文件应该是这样的:

test: model.o view.o controller.o main.o $(OPENVGLIBDIR)/libshapes.o $(OPENVGLIBDIR)/oglinit.o
    g++ -o test view.o main.o model.o controller.o $(OPENVGLIBDIR)/libshapes.o $(OPENVGLIBDIR)oglinit.o -L/opt/vc/lib -L/opt/vc/include -lGLES -ljpeg

view.o: view.cpp
    g++ -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I.. -c view.cpp

main.o: main.cpp
    g++ -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I.. -c main.cpp view.cpp

model.o: model.cpp
    g++ -c model.cpp

controller.o: controller.cpp
    g++ -c controller.cpp
于 2013-07-21T07:48:30.153 回答
0

这是我的文件,如果在 main.cpp 中包含 view.cpp 而不是 view.h,代码似乎运行良好,但我认为这不是我应该做的:

主文件

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include "model.h"
#include "view.h"
#include "controller.h"

using namespace std;

int main() {
  int n;
  View view;
  view.initialize();
  view.drawBackground();
  view.show();
      std::cin >> n;
}

视图.h:

#ifndef VIEW_H
#define VIEW_H

#include "VG/openvg.h"
#include "VG/vgu.h"
#include "fontinfo.h"
#include "shapes.h"

class View{
private:
    int width, height;

public:
    View();
    int getWidth();
    int getHeight();
        void drawBackground();
        void initialize();
        void show();
};

#endif

视图.cpp

#include "view.h"

View::View(){
int width, height;
    VGfloat w2, h2, w;
}

int View::getWidth(){
return width;
}

int View::getHeight(){
return height;
}

void View::drawBackground(){

Background(0,0,0);
Stroke(255,255,255,1);
Fill(255,0,0,1.0);
Circle(width/2, height/2, 100);
}

void View::initialize(){
init(&width, &height);
Start(width, height);
}

void View::show(){
End();
}
于 2013-07-22T23:33:20.993 回答
0

非常感谢您的帮助!在过去的几天里,我一直在与这个作斗争(这就是我习惯自动编译/链接的原因)。它有点基于那个例子。如果我自己制作每个对象,然后像这样将它们链接在一起,我可以让它运行:

test: model.o view.o controller.o main.o $(OPENVGLIBDIR)/libshapes.o $(OPENVGLIBDIR)/oglinit.o
    g++ -o test view.o main.o model.o controller.o $(OPENVGLIBDIR)/libshapes.o $(OPENVGLIBDIR)oglinit.o -L/opt/vc/lib -L/opt/vc/include -lGLES -ljpeg

view: view.cpp
    g++ -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I.. -c view.cpp

main: main.cpp
    g++ -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I.. -c main.cpp view.cpp

model: model.cpp
    g++ -c model.cpp

controller: controller.cpp
    g++ -c controller.cpp

如果我执行“make view”“make main”然后“make test”一切正常,但如果我尝试“make test”而没有在此之前创建任何对象,我会收到致命错误:VG/openvg.h:没有这样的文件或试图编译 view.cpp 时的目录

于 2013-07-24T22:33:28.387 回答