我正在学习在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,它会告诉我库中有什么定义...有什么帮助?
答案 0 :(得分: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.o
因此,如果您将该文件包含在多个目标文件中并链接它们(在这种情况下为view.o
和extern 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时没有这样的文件或目录