【问题标题】:GNU Make: How to build a common lib as both 32-bit and 64-bit?GNU Make:如何构建一个 32 位和 64 位的通用库?
【发布时间】:2012-06-24 18:22:50
【问题描述】:

我有一个文件夹布局如下的项目:

/project_root
  /common-code-sources
    /common1
    /common2
    /...
  /prog-A-sources
  /prog-B-sources
  /prog-C-sources

需要为程序 A、B 和 C 生成三个可执行文件。每个可执行文件都有少量唯一的源代码,但大多数都希望静态链接来自各种 libCommonCodeN.a 文件的功能。

但是,我需要构建 Program C 以及它所需的所有具有特定编译标志集的通用代码库。 (在这种情况下,是 32 位并且禁用了一些优化。)

这意味着程序 C 所需的common_sources 下的特定代码必须使用正确的标志再次编译。

我正在寻找有关如何最好地创建基于 Makefile 的构建系统来解决这种情况的想法。

我认为解决方案将涉及 lib 文件的并行输出文件夹和所谓的“目标特定”make 变量来指导该过程,但我不确定如何将它们组合在一起.

问题:common-code 源之一发生更改时,如何确保在项目根目录运行make 执行正确的操作?

也就是说:我怎样才能重建有问题的特定 .a 的两种风格并重新链接 3 个可执行文件?

【问题讨论】:

    标签: build build-automation static-libraries gnu-make


    【解决方案1】:

    这里有两种方法:

    • 维护单个 Makefile(您始终可以通过 include 指令拆分 Makefile)。
    • 为每个子项目维护自己的 Makefile(recursive make consider harmful 方法)。

    在第一种情况下,您可以完全控制依赖项...要进行自定义构建,请使用:

    $ 猫 Makefile ... ifeq '$(DEBUG)' '是' BUILD_DIR = 调试 CFLAGS += $(CFLAGS_DEBUG) 别的 BUILD_DIR = 释放 CFLAGS += $(CFLAGS_OPTIM) 万一 ... $ 使调试=是

    在第二种情况下,将第一个提示与:

    $ 猫 Makefile ... ifeq '$(DEBUG)' '是' BUILD_DIR = 调试 MODULE_A_BUILD_DIR = ../module-A/_debug_build CFLAGS += $(CFLAGS_DEBUG) 别的 BUILD_DIR = 释放 MODULE_A_BUILD_DIR = ../module-A/_release_build CFLAGS += $(CFLAGS_OPTIM) 万一 构建:$(MODULE_A_BUILD_DIR)/libmodulea.a 制作 -C $(MODULE_A_BUILD_DIR)/.. DEBUG=$(DEBUG) ...

    你在你的问题中说的都是正确的。只要做到逻辑一致,不要害怕))

    所以让 build / dist 路径依赖于 make 标志或目标模式:

    ifneq '$(filter %-debug,$(MAKECMDGOALS))' '' BUILD_DIR = 调试 MODULE_A_BUILD_DIR = ../module-A/_debug_build CFLAGS += $(CFLAGS_DEBUG) ... 万一

    【讨论】:

      猜你喜欢
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多