2012-02-08 61 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