首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多目标,自动依赖

多目标,自动依赖
EN

Stack Overflow用户
提问于 2014-07-12 09:33:12
回答 1查看 136关注 0票数 0

我正在C++做一个大项目。它由几个目标可执行文件组成,但其中大多数使用公共类。我的工作目录如下:

代码语言:javascript
复制
.
..
Classes/
    File.h
    File.cpp
    Encryption.h
    Encryption.cpp
    Database.h
    Database.cpp
Bin/ (I want my objects to be compiled there)

FirstProgram.cpp
SecondProgram.coo
ThirdProgram.cpp
Makefile
  1. 我的一些类使用外部库。例如,要编译Encryption.cpp,我需要向target添加-lssl。有什么办法让我的makefile知道吗?现在,我必须在所有使用Encryption.o的地方添加-lssl。
  2. 我有点厌倦了查看每个目标使用的对象,并用makefile编写它们。有没有办法让编译器找到所有所需的.o并自动编译它们?
  3. 我希望将编译好的文件存储在Bin/目录中,避免每次运行make时都重新编译它们。

现在,我的makefile看起来是:

代码语言:javascript
复制
CXX=g++
FLAGS=-g -Wall -std=c++11
CLASSES=./Classes

Bin/%.o: %.cpp
    $(CXX) $(FLAGS) -c -o $@ $<

Bin/%.o: $(CLASSES)/%.cpp
    $(CXX) $(FLAGS) -c -o $@ $<

FirstProgram: Bin/File.o Bin/Encryption.o Bin/Database.o
    $(CXX) $(FLAGS) -o Bin/$@ $^ -lssl `mysql_config --cflags --libs`


SecondProgram: ... Bin/... Bin/...
    $(CXX) $(FLAGS) -o Bin/$@ $^ ??? additional libs there
EN

回答 1

Stack Overflow用户

发布于 2014-07-12 09:58:33

对于1)您可以使用这样的东西:

代码语言:javascript
复制
CRYPT_TARGETS := FirstProgram ThirdProgram

$(CRYPT_TARGETS): LDLIBS += -lssl
$(CRYPT_TARGETS): Bin/Encryption.o

Bin/FirstProgram: Bin/File.o Bin/Database.o
    $(CXX) $(FLAGS) -o $@ $^ $(LDLIBS) `mysql_config --cflags --libs`

Bin/ThirdProgram: Bin/Astronomy.o Bin/KitchenSink.o
    $(CXX) $(FLAGS) -o $@ $^ $(LDLIBS) `mysql_config --cflags --libs`

(请注意我是如何更改目标名称的;如果规则的目的是构建文件,则目标应该是文件的确切名称。)

我不认为那是个好主意。在编辑代码时,您应该知道从二进制文件中添加和删除哪些组件,所以这并不是什么额外的工作。而且,Make不可能知道不存在的对象是必需的,除非您将命名约定强加给自己,而这些约定不是语言的一部分(如果您喜欢这个想法,请告诉我们,我们将向您展示如何)。然后是main冲突..。如果对象的列表越来越长,并且重叠很多,那么也许您应该构建库。

( 3)是个好主意,看起来你的makefile已经可以做到了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24711603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档