我正在尝试在Linux上使用openGL和SFML分发一些用C ++编写的软件。我正在尝试使用我的代码提供sfml库和头文件以避免安装sfml(使用它的人没有root访问权限,但是他们将安装所有需要的openGL东西)。
我的文件层次结构如下:
这是我的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的一个错误,但我没有这么多的经验......
提前致谢!
答案 0 :(得分:3)
您需要将-I$(INCDIR)
放入CPPFLAGS
,而不是LDFLAGS
。然后它将被内置规则选取,用于编译单个目标文件。
您还应将CFLAGS
重命名为CXXFLAGS
,将CC
重命名为CXX
。 CC
和CFLAGS
用于 C 源文件,而不是C ++源文件。
你应该不让$(EJECUTABLE)
依赖clean
,你不应该在link命令后执行rm -f $(MODULOS)
。这些东西违背了Makefile的目的,即只重新编译必要的内容,而不是每次重新编译整个程序。
答案 1 :(得分:1)
问题不在编译器中,而是在Makefile中:你想在相应的标志中设置include目录路径(我通常使用CPPFLAGS
但我通常也有自己的规则明确引用我正在使用的旗帜)。 LDFLAGS
肯定只传递给构建的链接阶段。