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

标签 c++ makefile g++ sfml

我正在尝试在使用 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 重命名为 CXXCCCFLAGS 用于 C 源文件,而不是 C++ 源文件。

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

关于c++ - 为什么 g++ 不使用 -I 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186582/

相关文章:

c++ - QT - 如何移动文件

bash - 除了使用 g++ 的文件之外,我如何编译所有 .cpp 文件?

c++ - 在包含对 cuda 内核的引用的库中链接

c++ - C/C++ 中大型非稀疏非方矩阵的多线程乘法

c++ - 为面向对象的 C++ 代码开发 C 包装 API

c - GCC 和 Makefile(一个函数的多个声明,即使只有一个?)

powershell - GNU Make 和 Windows Powershell : "Remove-Item -ErrorAction Ignore" does not work

c++ - 支持 c++11 的 Makefile

VC++ 和 g++/Xcode 之间的 C++ 模板函数差异

c++ - C++ 中意外的 long long 值