g++-我喜欢复制图书馆 我在Linux学习C++程序,我有以下问题:
我有4个文件:main.cpp、model.cpp、view.cpp和controller.cpp,每个文件(main除外)都有自己的头文件。main.cpp包括model.h、view.h和controller.h,view.h包括仅与之相关的其他库(运行图形库所必需的)。这些库位于不同的文件夹中,并且有自己的其他依赖项(这就是我不想移动它们的原因)。因此,我的makefile如下所示: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
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