【问题标题】:Why doesn't g++ use the -I option?为什么 g++ 不使用 -I 选项?
【发布时间】:2012-02-29 11:46:16
【问题描述】:

我正在尝试在使用 openGL 和 SFML 的 Linux 上分发用 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 时,一切顺利,如果我在没有安装它的 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 标头)包含像 #include 这样的行,所以我需要它们在我指定的路径上搜索。

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

提前致谢!

【问题讨论】:

    标签: c++ makefile g++ sfml


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,成功了!我猜这个错误来自我在 LDFLAGS 的 -I$(INCDIR)。 CXXFLAGS 和 CXX 是一种风格约定,不是吗?我会好好使用的,谢谢 :)
    • 这不仅仅是一种风格约定——隐含的%.o: %.c 规则使用CCCFLAGS,隐含的%.o: %.cpp 规则使用CXXCXXFLAGS。 (他们都使用CPPFLAGS。)
    • 很高兴知道这一点!你能给我推荐一个 Makefile 教程或参考手册吗?
    【解决方案2】:

    问题不在于编译器,而在于您的 Makefile:您想在适当的标志中设置包含目录路径(我通常使用 CPPFLAGS,但我通常也有自己的规则明确引用我的标志正在使用)。 LDFLAGS 肯定只传递到构建的链接阶段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2022-01-08
      • 2010-12-20
      • 2013-09-02
      • 1970-01-01
      相关资源
      最近更新 更多