我正在尝试在使用 openGL 和 SFML 的 Linux 上分发用 C++ 编写的小软件。我正在尝试为我的代码提供 sfml 库和 header ,以避免安装 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)
当我在 PC (Ubuntu 11.10) 中运行 make 并在/usr/lib 中安装了 sfml 时一切顺利,如果我在没有安装它的 PC 中运行它会说:
...
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 header )包含类似 #include < SFML/Window/Whatever.hpp > 的行,因此我需要它们在我指定的路径中搜索。
我错过了什么吗?我想这是我的 Makefile 的错误,但我没有太多经验......
提前致谢!
最佳答案
您需要将-I$(INCDIR)
放入CPPFLAGS
,而不是LDFLAGS
。然后它会被编译单个目标文件的内置规则选中。
您还应该将 CFLAGS
重命名为 CXXFLAGS
并将 CC
重命名为 CXX
。 CC
和 CFLAGS
用于 C 源文件,而不是 C++ 源文件。
你不应该不让$(EJECUTABLE)
依赖于clean
,你不应该执行rm -f $(MODULOS )
在链接命令之后。这些东西违背了 Makefile 的目的,即只重新编译必要的部分,而不是每次都重新编译整个程序。
关于c++ - 为什么 g++ 不使用 -I 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186582/