如何在多个文件中使用#define编译gcc

时间:2013-05-09 07:18:47

标签: gcc g++

我有一个包含多个文件的项目..我想从命令行使用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文件添加一些#define,我必须通过命令行完成。该怎么做??

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

2 个答案:

答案 0 :(得分: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 <Comp/foo.h>#include "Comp/foo.h"之类的子路径,那么您只需要在CPPFLAGS中使用-Iinclude,但如果您正在执行类似“foo.h”和foo的操作.h实际上是在include / Comp /然后将-Iinclude/Comp-Iinclude/Decomp添加到CPPFLAGS

它说<tab>确保你使用TAB键插入标签(不要输入单词'')

盲目使用此Makefile之前。知道它不会像你必须更正条目那样工作。它是作为一个起点提供的......阅读撰写Makefiles ... http://frank.mtsu.edu/~csdept/FacilitiesAndResources/make.htm有一个很好的介绍

答案 1 :(得分:1)

可以使用-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()的文件时在命令行上指定它们。