簡體   English   中英

g ++-我復制庫

[英]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.oview.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM