Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在多个文件中使用#define进行gcc编译_Gcc_G++ - Fatal编程技术网

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

如何在多个文件中使用#define进行gcc编译,gcc,g++,Gcc,G++,我有一个包含多个文件的项目。。我想从命令行使用gcc编译它 目录如下所示 lib/ Comp/ contains .cpp files Decomp/ contains .cpp files Globals.cpp include/ Comp/ contains .h files Deco

我有一个包含多个文件的项目。。我想从命令行使用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
s,我必须通过命令行来完成。怎么做


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

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

g++ -Iinclude lib/Comp/*.cpp lib/Decomp/*.cpp lib/Globals.cpp -o test
您的.cpp文件应
#包括
或其他内容

正确的管理方法是使用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 $< 
CXX=g++
CPPFLAGS=-Iinclude-DFOO-DBAR=1-DSOME\u STRING=\“我的名字”
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=$(来源:%.cpp=%.o)
默认值:test
测试:$(OBJ)
$(CXX)-o$@$(OBJ)
%.o:%.cpp
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<
笔记 将file1.cpp等替换为项目中的实际文件名。不要在源文件中仅包含.cpp或.cc文件的标题

如果在源文件中使用子路径,如
#include
#include“Comp/foo.h”
,则只需在cppfaglass中使用-Iinclude,但如果您正在执行类似于“foo.h”的操作,并且foo.h实际上在include/Comp/中,则将
-Iinclude/Comp
-Iinclude/Decomp>添加到cppfaglass

在显示
的位置,确保使用TAB键插入选项卡(不要键入单词“”)


在盲目使用这个Makefile之前。要知道它不会按原样工作,您必须更正条目。这是一个起点。。。阅读有关编写makefile的内容。。。有一个很好的介绍

可以在编译器命令行上使用-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()

的文件时在命令行上指定它们,这没问题。但是如何在预处理器标志中添加#defines in make file?use-D标志。。。我将编辑答案以显示一些示例