我有一个包含多个文件的项目..我想从命令行使用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
,我必须通过命令行完成。该怎么做??
如果我必须自己编译每个文件然后链接它们。这样做的恰当顺序是什么?
答案 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()
的文件时在命令行上指定它们。