加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用不同的预处理器宏在同一源树上构建多个目标

发布时间:2020-12-16 09:42:27 所属栏目:百科 来源:网络整理
导读:我对make和autotools(我还没有用于这个项目)的知识充其量是最基本的,尽管在很长一段时间内进行了大量的谷歌搜索和实验.我有一个像下面这样的源层次结构,我正在尝试尽可能无缝地找到构建方法. 该应用程序由一个主应用程序组成,其中包含app / src下各种子文件
我对make和autotools(我还没有用于这个项目)的知识充其量是最基本的,尽管在很长一段时间内进行了大量的谷歌搜索和实验.我有一个像下面这样的源层次结构,我正在尝试尽可能无缝地找到构建方法.

该应用程序由一个主应用程序组成,其中包含app / src下各种子文件夹中的源代码.这些是使用该文件夹的根目录中的相应Makefile构建的.

然后我有多个其他实用程序驻留在app / tools下的不同文件夹,每个文件夹都有自己的Makefile.

app/src/module1/file1.cpp
app/src/module1/file1.hpp
app/src/module2/file2.cpp
app/src/module2/file2.hpp
app/src/module3/file3.cpp
app/src/module3/file3.hpp
app/src/main.cpp
app/src/main.hpp
app/src/Makefile
app/tools/util1/file1.cpp
app/tools/util1/file1.hpp
app/tools/util1/Makefile
app/tools/util2/file2.cpp
app/tools/util2/file2.hpp
app/tools/util2/Makefile

对我来说问题是,其中一些工具依赖于app / src源文件夹中的源文件,但启用了预处理宏EXTERNAL_TOOL.因此,编译主应用程序和varous实用程序生成的目标文件不兼容.

目前要构建项目的每个部分,我必须清理它们之间的源树.这很痛苦,当然不是我想要的.解决这个问题的最佳方法是什么?我所拥有的那些我无法付诸实践的想法是:

>为项目的每个部分单独构建目录
>构建外部工具时,以某种方式在主应用程序源代码树中标记其对象文件(util.file1.o?)

我不太确定我有时间和耐心需要掌握make / autotools.可能其他一个构建工具(scons?cmake?)使这种任务更容易实现?如果是这样的话?

更新:这就是我现在所拥有的

SOURCES := util1.cpp util2.cpp util3.cpp 
    ../../src/module1/file1.cpp 
    ../../src/module1/file2.cpp 
    ../../src/module1/file3.cpp 
    ../../src/module2/file4.cpp 
    ../../src/module3/file5.cpp 
    ../../src/module3/file6.cpp 
    ../../src/module4/file7.cpp 
    ../../src/module4/file8.cpp 
    ../../src/module3/file9.cpp 
    ../../src/module4/file10.cpp 
    ../../src/module5/file11.cpp 
    ../../src/module3/file12.cpp 
    ../../src/module1/file13.cpp 
    ../../src/module3/file14.cpp 
    ../../src/module3/file15.cpp

OBJECTS = $(join $(addsuffix .util/,$(dir $(SOURCES))),$(notdir $(SOURCES:.cpp=.o)))

.PHONY: all mkdir
all: util
util: $(OBJECTS)
    $(CXX) $(CXXFLAGS) $(OBJECTS) $(LIBS) -o util

$(OBJECTS): | mkdir
    $(CXX) -c $(CXXFLAGS) -o $@ $(patsubst %.o,%.cpp,$(subst .util/,$@))

mkdir:
    @mkdir -p $(sort $(dir $(OBJECTS)))

clean:
    -@rm -f $(OBJECTS) util
    -@rmdir $(sort $(dir $(OBJECTS))) 2>/dev/null

经过广泛的谷歌搜索浏览后,我发现了这一点.这似乎有效,但这部分看起来并不特别好(感觉有点像黑客):

$(OBJECTS): | mkdir
    $(CXX) -c $(CXXFLAGS) -o $@ $(patsubst %.o,$@))

特别是我不太热衷于我之前从源创建对象列表并添加后缀,只是在这里做反向.我似乎无法让它以任何其他方式工作.

解决方法

CMake具有add_definitions和remove_definitions命令.您可以使用它们为项目的不同部分定义宏:

# building tools #
add_definitions(-DEXTERNAL_TOOL)
add_subdirectory($TOOL1$$BUILD_DIR$)
add_subdirectory($TOOL2$$BUILD_DIR$)
...

# building main app #
remove_definitions(-DEXTERNAL_TOOL)
add_executable(...)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读