[英]g++ -I duplicating libraries
我正在學習在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,它告訴我庫中的內容有多個定義……有什么幫助嗎?
#include VG/openvg.h
位於/opt/vc/include
,並包含在view.h
make view
您將從view.cpp
中包含它,該make view
使用-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
make test
時,它正在尋找.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.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();
}
非常感謝您的幫助! 在過去的幾天里,我一直在為此而奮斗(這是我習慣於自動編譯/鏈接的結果)。 它有點基於該示例。 如果我自己制作每個對象,然后將它們全部鏈接在一起,就可以使其運行:
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時的目錄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.