【问题标题】:how to gcc compile with #define in multiple files如何在多个文件中使用 #define 进行 gcc 编译
【发布时间】:2013-05-09 07:18:46
【问题描述】:

我有一个包含多个文件的项目。我想从命令行使用 gcc 编译它。

目录如下所示

lib/
    Comp/                              contains .cpp files
    Decomp/                            contains .cpp files
    Globals.cpp
include/
    Comp/                              contains .h files
    Decomp/                            contains .h files
    Globals.h

其中一些 .h 文件未与 .cpp 文件配对

要编译它,我使用类似这样的东西:

g++ lib/Comp/* lib/Decomp/* lib/Globals.cpp -std=c++0x -o TEST

问题是,我必须为每个 .h 文件添加一些 #defines,我必须通过命令行来完成。这个怎么办??

如果我必须自己编译每个文件然后链接它们。这样做的适当顺序是什么?

【问题讨论】:

    标签: gcc g++


    【解决方案1】:

    最肮脏最丑陋的方式是你想使用类似的东西:

    g++ -Iinclude lib/Comp/*.cpp lib/Decomp/*.cpp lib/Globals.cpp -o test
    

    你的 .cpp 文件应该是 #include <Comp/foo.h> 或者其他的

    管理此问题的正确方法是使用 makefile 构建每个目标文件,然后将它们链接在一起:

    生成文件

    创建一个名为Makefile 的文件并将以下内容放入其中:

    CXX=g++
    CPPFLAGS=-Iinclude -DFOO -DBAR=1 -DSOME_STRING=\"My Name\"
    CXXFLAGS=-O2 -g 
    
    SOURCES=lib/Comp/file1.cpp \
            lib/Comp/file2.cpp \
            lib/Comp/file3.cpp \
            lib/Decomp/file1.cpp \
            lib/Decomp/file2.cpp \
            ... 
    
    OBJ=$(SOURCES:%.cpp=%.o)
    
    
    default: test
    
    test: $(OBJ)
    <tab>     $(CXX) -o $@ $(OBJ) 
    
    %.o: %.cpp
    <tab>     $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $< 
    

    注意事项

    将 file1.cpp 等替换为项目中的实际文件名。不要在 SOURCES 中仅包含 .cpp 或 .cc 文件的标题

    如果您在源文件中使用 #include &lt;Comp/foo.h&gt;#include "Comp/foo.h" 之类的子路径,那么您只需要在 CPPFLAGS 中使用 -Iinclude 但如果您正在执行类似“foo.h”的操作,而 foo.h 实际上是在 include/Comp/ 然后将 -Iinclude/Comp-Iinclude/Decomp 添加到 CPPFLAGS

    在上面写着&lt;tab&gt; 的地方,请确保您使用 TAB 键插入标签(不要输入单词 '')

    在盲目使用这个 Makefile 之前。知道它不会起作用,因为您必须更正条目。它是作为起点提供的...阅读有关编写 Makefile 的内容...http://frank.mtsu.edu/~csdept/FacilitiesAndResources/make.htm 有一个很好的介绍

    【讨论】:

    • 没关系。但是如何在make文件中添加#defines ??
    • 在预处理器标志中使用 -D 标志...我将编辑答案以显示一些示例
    【解决方案2】:

    可以使用 -DVAR=VALUE 在编译器命令行上提供定义(在 Windows 上,大概是 /DVAR=VALUE)。请注意,您可以为不同的标头提供不同的定义,如下所示:

    compiler -DX=one first.h -DX=two second.h third.cc -o third.o
    

    在这种情况下,我的编译器会发出警告,并对所有源代码使用 X 的最后一个值。

    无论如何,一般来说你不应该在编译行列出头文件;更喜欢从需要它们的实现文件(.cc/.cpp 或其他)中包含它们。

    也要小心 - 如果您要更改定义以修改类定义、内联函数实现等。您最终可能会出现技术上和/或实际上未定义的行为。

    关于如何最好地决定创建和链接哪些对象 - 您可能希望每个 .cc/.cpp 文件都有一个对象。您可以链接这些对象,然后在编译包含main() 的文件时在命令行中指定它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 2012-03-30
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多