g ++ -I复制库

时间:2013-07-20 03:37:09

标签: c++ gcc makefile g++ raspberry-pi

我正在学习在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,它会告诉我库中有什么定义...有什么帮助?

3 个答案:

答案 0 :(得分:0)

#include VG/openvg.h位于/opt/vc/include,包含在view.h

当您make viewview.cpp包含在-I/opt/vc/include中时,make main

当你main.cppmain: main.cpp g++ -c -I/opt/vc/include main.cpp 包含它而没有标记编译时,它找不到文件。

您需要添加标记

view.h

您可能还需要其他标记,具体取决于$(OPENVGLIBDIR)/fontinfo.h包含的内容。

多个定义由Fontinfo SansTypeface, SerifTypeface, MonoTypeface;

引起

包含

main.o

因此,如果您将该文件包含在多个目标文件中并链接它们(在这种情况下为view.oextern Fontinfo SansTypeface, SerifTypeface, MonoTypeface; ),您将获得多个定义。

将其更改为

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

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

view.h

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

.o

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

在你的makefile中,view / model / controller / main目标正在生成.o个文件,因此它们也应该是make test。当.o没有.o时,它正在寻找g++ -c目标。如果你的makefile中没有一个,它将使用默认值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

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

{{1}}

答案 1 :(得分:0)

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

的main.cpp

#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;
}

view.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

view.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();
}

答案 2 :(得分: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时没有这样的文件或目录