Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
g++-我喜欢复制图书馆 我在Linux学习C++程序,我有以下问题:_C++_Gcc_Makefile_G++_Raspberry Pi - Fatal编程技术网

g++-我喜欢复制图书馆 我在Linux学习C++程序,我有以下问题:

g++-我喜欢复制图书馆 我在Linux学习C++程序,我有以下问题:,c++,gcc,makefile,g++,raspberry-pi,C++,Gcc,Makefile,G++,Raspberry Pi,我有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: vi

我有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
据我所知,当我用“makeview”编译视图时,它可以毫无问题地找到包含的文件,因为它有它必须查找的路径,但由于“makemain”没有这些路径,它不知道在哪里查找openvg.h。问题是,如果我将路径添加到main,它会告诉我库中的内容有多个定义。。。有什么帮助吗?

包含VG/openvg.h的
/opt/vc/include
中,并且包含在
视图.h

当您
创建视图
时,您将从
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.o
view.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中,view/model/controller/main目标正在生成
.o
文件,因此它们也应该是
.o
。当您在不存在
.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

这是我的文件,如果在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.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();
}

非常感谢你的帮助,伙计!在过去的几天里,我一直在努力解决这个问题(这就是我习惯于自动编译/链接的原因)。这在某种程度上是基于那个例子。如果我单独创建每个对象,然后像这样将它们链接在一起,我可以使其运行:

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时没有这样的文件或目录如果在多个位置包含相同的头时出现“多个定义”错误,这就意味着在头文件中定义了不应该存在的内容。我建议把这个问题归结为a,然后发布代码。VG/openvg.h
在哪里?
view.h
“包含”库在什么意义上?
view.h
有头保护吗?很明显,它找不到VG/openvg.h-这个文件在哪里,如果它在/opt/vc/。。。当我把make main改为你建议的,现在它们可以单独编译,y可以make main没有问题,我也可以make view有问题,但是,我尝试链接输出对象,但它们仍然为我提供了视图中任何内容的多个定义。hI可以查看视图中的内容。h或至少是错误,我看不出您如何获得多个定义,除非您在头文件中定义非外部全局变量。抱歉,我在应答器中复制了文件的内容您的视图文件看起来不错,您用来链接它们的命令是什么,第一个错误确切地说是什么?我已经尝试了几件事:在这一点上,我正在尝试以下操作:g++-o test main.o model.o controller.o$(OPENVGLIBDIR)/libshapes.o$(OPENVGLIBDIR)/o-L/opt/vc/lib-lGESv2-ljpeg
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