2012-02-08 62 views
3

我正在嘗試在使用openGL和SFML的Linux上分發一些用C++編寫的軟件。我試圖爲我的代碼提供sfml庫和頭文件,以避免安裝sfml(使用它的人沒有root權限,但他們將安裝所有需要的東西)。爲什麼g ++不使用-I選項?

我的文件層次結構如下所示:

  • 的lib/>>這裏去所有SFML庫(.so文件)
  • Makefile文件>>後,我展示的代碼
  • 的src/>>這裏去計劃和SFML來源
    • myfiles.h,myfiles.cpp >>全部編譯和安裝在/ usr/lib目錄
    • SFML的SFML庫好吧工作/ >>這裏去所有SFML頭,已小號青梅子

這裏是我的Makefile:

EJECUTABLE = app 

MODULOS = src/main.o src/Handbapp.o src/Camera.o src/Light.o src/Scene.o src/Graphics.o src/Window.o src/Model.o src/Court.o src/Player.o src/Primitives.o src/Path.o 

CC = g++ 
LIBDIR = ./lib 
INCDIR = ./src 

LIBS = -lsfml-window -lsfml-system -lGLU 

LDFLAGS = -L$(LIBDIR) -I$(INCDIR) 
CFLAGS = -v -Wl,-rpath,$(LIBDIR) 

$(EJECUTABLE): clean $(MODULOS) 
    $(CC) $(CFLAGS) -o $(EJECUTABLE) $(LDFLAGS) $(MODULOS) $(LIBS) 
    rm -f $(MODULOS) 

clean: 
    rm -f $(MODULOS) $(EJECUTABLE) 

當我運行make在PC(Ubuntu的11.10),與安裝在SFML/usr/lib中一切順利,如果我做一個不安裝它,它說:

... 
g++ -c -o src/main.o src/main.cpp 
In file included from src/main.h:18:0, 
       from src/main.cpp:10: 
src/Handbapp.h:17:44: fatal error: SFML/Window.hpp: File or directory doesn't exist 
Compilation finished. 
make: *** [src/main.o] Error 1 

這裏有一段代碼顯示了包括Handbapp.h:

... 
#ifndef HANDBAPP_H 
#define HANDBAPP_H 

// Espacio de nombres 
using namespace std; 

// Librerias 
#include <GL/gl.h> // OpenGL 
#include <GL/glu.h> // Utilidades OpenGL 
#include <SFML/Window.hpp> // Ventanas SFML <- LINE 17 
#include <SFML/System.hpp> // SFML 

我試圖使的#include 「無論/ Window.hpp」,改變的src/SFML文件夾名稱不管是什麼,而不是用在連接器-I選項,但SRC/SFML/Window.hpp(和其他sfml標題)包含這樣的行#include < SFML/Window/Whatever.hpp>,所以我需要它們在我指定的路徑上搜索。

我錯過了什麼嗎?我想這是我的Makefile的錯誤,但我沒有太多的經驗...

在此先感謝!

回答

3

您需要將-I$(INCDIR)放入CPPFLAGS而不是LDFLAGS。然後它將被內置的編譯單個對象文件的規則所取代。

您還應該將CFLAGS重命名爲CXXFLAGSCCCXXCCCFLAGS用於C源文件,而不是C++源文件。

你應該沒有$(EJECUTABLE)取決於clean,你不應該鏈接命令後執行rm -f $(MODULOS)。這些東西擊敗了Makefile的目的,即只重新編譯必要的東西,而不是每次都重新編譯整個程序。

+0

謝謝,它的工作!我想這個錯誤來自我的-I $(INCDIR)在LDFLAGS。 CXXFLAGS和CXX是一種風格約定,不是嗎?我會正確使用它,thx再次:) – rogelius 2012-02-08 01:39:46

+0

這是一個比風格約定稍微多一點 - 隱式的'%.o:%.c'規則使用'CC'和'CFLAGS',隱式的'%.o: %.cpp規則使用'CXX'和'CXXFLAGS'。 (他們倆都使用'CPPFLAGS'。) – zwol 2012-02-08 01:59:37

+0

很高興知道!你能推薦我一個Makefile教程或參考手冊嗎? – rogelius 2012-02-08 02:35:19

1

這個問題不在編譯器中,而是在你的Makefile中:你想在適當的標誌中設置include目錄路徑(我通常使用CPPFLAGS,但我通常也有我自己的規則,明確引用標誌I'使用)。 LDFLAGS肯定只傳遞給構建的鏈接階段。

+0

謝謝,這是一個很好的觀點,我會盡力記住它! – rogelius 2012-02-08 01:41:35