gpt4 book ai didi

c++ - 使用 makefile (c++) 部分编译和包含 boost

转载 作者:行者123 更新时间:2023-11-27 23:49:31 26 4
gpt4 key购买 nike

我有一个 C++ 项目,我希望它具有合理的可移植性,并且可以通过发出单个“make”命令进行编译。我目前对某些操作使用 boost header ,但现在需要来自 boost 的“文件系统”,这需要编译。

我知道有一种方法可以使用附带的 shell 脚本编译 boost,但这需要很长时间。我很好奇一种有选择地编译 boost 库的方法,如 makefile 中指定的那样,并将它们包含在链接过程中。

我目前的总体思路是:

  1. 有一个要编译和包含的 boost 库的 makefile 变量。

  2. 从 boost 分发文件夹编译这些库(在任何依赖项目之前),并将编译后的二进制文件输出到 makefile 项目中的特定文件夹(例如:“lib”文件夹)

  3. 我了解如何使用以下方法将这些文件包含在项目中:

    -Llib

执行此操作的最佳方法是什么,以及选择编译的 boost 输出在哪里?文件应该是 .a 还是 .o 文件? (或者没有扩展名?)

最佳答案

这是先前答案的手动 makefile 的更狂野的哥哥。给定 BOOST 发行版的路径,BOOST_DISTRO , 它会为 TARGET_BOOST_LIBS 中指定的目标库找到相关的源文件, 将它们编译成 $(WORK_FOLDER)/<lib>/ , 并将生成的对象存档到 $(DEST_FOLDER)/libboost_<lib>.a .

BOOST_DISTRO=.
DEST_FOLDER=libs
WORK_FOLDER=build

TARGET_BOOST_LIBS=\
system \
filesystem \
serialization

.PHONY: all
all: $(foreach lib,$(TARGET_BOOST_LIBS),$(DEST_FOLDER)/libboost_$(lib).a )

$(DEST_FOLDER):
mkdir -p $(DEST_FOLDER)

$(WORK_FOLDER):
mkdir -p $(WORK_FOLDER)

#####
# helper for building the .o files in WORK_FOLDER
#####
define MAKE_BOOST_LIB_COMPILE_RULES
$(foreach cppfile,$(shell ls $(BOOST_DISTRO)/boost/libs/$(1)/src/*.cpp),$(WORK_FOLDER)/$(1)/$(notdir $(cppfile:.cpp=.o)): $(cppfile) | $(WORK_FOLDER)/$(1)
$(CXX) $(CXXFLAGS) -D BOOST_ALL_NO_LIB \
-I$(BOOST_DISTRO)/boost \
-c $$^ \
-o $$@
)
endef


#####
# define the build rules based on the files we find in the subfolders of
# the boost distro that correspond to our library names
#####
define BUILD_BOOST_LIB
$(WORK_FOLDER)/$(1): | $(WORK_FOLDER)
mkdir -p $$@
$(call MAKE_BOOST_LIB_COMPILE_RULES,$(1))
$(DEST_FOLDER)/libboost_$(1).a: $(foreach cppfile,$(notdir $(shell ls $(BOOST_DISTRO)/boost/libs/$(1)/src/*.cpp)),$(WORK_FOLDER)/$(1)/$(cppfile:.cpp=.o)) | $(DEST_FOLDER)
ar r $$@ $$^
ranlib $$@
endef


#####
# dynamically generate the build rules from the list of libs
#####
$(foreach lib,$(TARGET_BOOST_LIBS),$(eval $(call BUILD_BOOST_LIB,$(lib))))

.PHONY: clean
clean:
-rm -rf $(WORK_FOLDER)
-rm -rf $(DEST_FOLDER)

用我古老的 BOOST ( #define BOOST_VERSION 105500 ) 进行测试,这会构建列出的库,并且虚拟测试程序成功编译并调用 boost::filesystem::absolute() .

关于c++ - 使用 makefile (c++) 部分编译和包含 boost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47519561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com