如何在多个文件中使用#define进行gcc编译
我有一个包含多个文件的项目。。我想从命令行使用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
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标志。。。我将编辑答案以显示一些示例