2012-02-08 2 views
3

Я пытаюсь распространять небольшое программное обеспечение, написанное на C++ в Linux, которое использует openGL и SFML. Я пытаюсь предоставить sfml-библиотеки и заголовки с моим кодом, чтобы избежать установки sfml (люди, которые будут использовать его, не имеют корневого доступа, но у них будет все необходимое для работы с OpenGL).Почему g ++ не использует параметр -I?

Моя файловая иерархия выглядит следующим образом:

  • Библиотека/>> здесь идет все библиотеки SFML (.so файлы)
  • Makefile >> Я позже показать код
  • SRC/>> здесь идет программа и SFML источники
    • myfiles.h, myfiles.cpp >> все их компилировать и работать Allright с SFML библиотек, установленных в/USR/Lib
    • SFML/>> здесь идет все заголовки SFML, имеет s екоторые подпапок

Вот мой 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) 

Когда я бегу сделать в ПК (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 в CXXFLAGS и CC на номер CXX. CC и CFLAGS для C исходные файлы, а не исходные файлы на C++.

Вы должны не имеют $(EJECUTABLE) зависят от clean, и вы не должны выполнять rm -f $(MODULOS) после команды связи. Эти вещи преследуют цель Makefile, которая заключается в том, чтобы перекомпилировать только то, что необходимо, а не всю программу каждый раз.

+0

Спасибо, это сработало! Я предполагаю, что ошибка произошла из моего -I $ (INCDIR), находящегося в LDFLAGS. CXXFLAGS и CXX - это соглашение о стиле, не так ли? Я буду использовать его правильно, thx снова :) – rogelius

+0

Это немного больше, чем соглашение о стиле - неявное '.% .O:% .c' правило использует' CC' и 'CFLAGS', неявное'% .o: Правило .cpp' использует 'CXX' и' CXXFLAGS'. (Оба они также используют 'CPPFLAGS'.) – zwol

+0

Полезно знать об этом! Можете ли вы порекомендовать мне учебник Makefile или справочное руководство? – rogelius

1

Проблема заключается не в компиляторе, а в вашем файле Makefile: вы хотите настроить путь к каталогу include в соответствующих флагах (обычно я использую CPPFLAGS, но у меня также есть свои собственные правила, которые явно ссылаются на флаги I ' м).LDFLAGS определенно передаются только на этап компоновки сборки.

+0

Спасибо, это хороший момент, я постараюсь запомнить его! – rogelius