为什么g ++不使用-I选项?

时间:2012-02-08 01:21:23

标签: c++ makefile g++ sfml

我正在尝试在Linux上使用openGL和SFML分发一些用C ++编写的软件。我正在尝试使用我的代码提供sfml库和头文件以避免安装sfml(使用它的人没有root访问权限,但是他们将安装所有需要的openGL东西)。

我的文件层次结构如下:

  • 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)

当我在/ usr / lib中安装了sfml的PC(Ubuntu 11.10)中运行make时,一切顺利,如果我在没有安装sfml的情况下执行make,则说:

...
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“whatever / Window.hpp”,更改src / SFML文件夹名称,而不是在链接器上使用-I选项,但是src / SFML / Window .hpp(和其他sfml标题)包含类似 #include&lt;的行。 SFML / Window / Whatever.hpp&gt; ,所以我需要它们在我指定的路径上搜索。

我错过了什么吗?我猜这是我的Makefile的一个错误,但我没有这么多的经验......

提前致谢!

2 个答案:

答案 0 :(得分:3)

您需要将-I$(INCDIR)放入CPPFLAGS,而不是LDFLAGS。然后它将被内置规则选取,用于编译单个目标文件。

您还应将CFLAGS重命名为CXXFLAGS,将CC重命名为CXXCCCFLAGS用于 C 源文件,而不是C ++源文件。

你应该$(EJECUTABLE)依赖clean,你不应该在link命令后执行rm -f $(MODULOS)。这些东西违背了Makefile的目的,即只重新编译必要的内容,而不是每次重新编译整个程序。

答案 1 :(得分:1)

问题不在编译器中,而是在Makefile中:你想在相应的标志中设置include目录路径(我通常使用CPPFLAGS但我通常也有自己的规则明确引用我正在使用的旗帜)。 LDFLAGS肯定只传递给构建的链接阶段。