Почему g ++ не использует опцию -I? - PullRequest
3 голосов
/ 08 февраля 2012

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

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

  • lib / >> здесь идут все библиотеки sfml (.so файлы)
  • Makefile >> позже я покажу код
  • src / >> Вот исходники программ и sfml
    • myfiles.h, myfiles.cpp >> все они компилируются и работают нормально с библиотеками sfml, установленными в / usr / lib
    • 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 на ПК (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

Я пытался сделать # включающим "what / Window.hpp" , меняя имя папки src / SFML для чего угодно и не используя опцию -I на компоновщике, но src / SFML / Window. hpp (и другие заголовки sfml) имеют такие строки включения, как # include , поэтому мне нужно, чтобы они выполняли поиск по указанному мною пути.

Я что-то упустил? Я думаю, что это ошибка с моим Makefile, но у меня не так много опыта с этим ...

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Вы должны поместить -I$(INCDIR) в CPPFLAGS, а не LDFLAGS. Затем он будет выбран встроенным правилом для компиляции отдельных объектных файлов.

Вы также должны переименовать CFLAGS в CXXFLAGS и CC в CXX. CC и CFLAGS предназначены для исходных файлов C , а не для исходных файлов C ++.

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

1 голос
/ 08 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...