【发布时间】:2019-03-04 20:20:36
【问题描述】:
我正在使用 IAR EWARM 8.10.1,它使用 ILINK 链接器。
我有两个编译单元使用的公共头文件。它包括具有外部链接的函数原型并构成API。根据构建的配置方式,我希望模块 A 或 B 与我的应用程序的其余部分链接。
[ Common_Header.h ]
| |
| +----- [Module_A.c] ---> [Module_A.o]
|
+--------------- [Module_B.c] ---> [Module_B.o]
我想以某种方式将参数传递给 ilinkarm.exe 以包含 Module_A.o。
我过去使用的其他 IAR 工具链使用了 XLINK 链接器。 XLINK 有一个 -A 选项,我想这与我需要的类似。
我本质上想要的是,当 Module_A 处于活动状态时,Module_B 中的函数定义被视为 __weak,反之亦然。
如果可能,我想避免将#pragma weak 放入我的代码中。我需要能够用几个不同的工具链编译这段代码。所以我需要用#ifdef __ICCARM__之类的东西来包装任何这样的pramgas。此外,我需要定义一些额外的预处理器符号,以便在另一个模块处于活动状态时有条件地使一个模块变弱。这是我希望避免在代码之外的所有复杂性。
此外,当 module_A 处于活动状态时,我不想将 module_B 从构建中排除。我希望两个模块始终编译。如果有人对接口和 module_A 进行了更改,但未能更新 module_B,我希望他们得到编译器错误。随着接口的发展,这将使 module_B 不会进入一些孤立和损坏的状态,并且我们的注意力会集中在 module_A 上。
我已查看 EWARM_DevelopmentGuide.ENU.pdf,但找不到似乎可以满足我要求的命令行选项。我想知道这样的选项是否存在而我错过了,或者是否有其他方法可以完成我所追求的目标。
【问题讨论】:
-
您还没有提出我们可以回答的问题。大概你尝试了一些东西,但它没有用。你尝试了什么?问题是什么?您似乎已经知道如何执行此操作的选项(-A 选项和
__weak关键字)。 -
我不使用 EWARM,所以无法回答,但当然可以从 IDE 中的 构建配置 中排除单个文件或组 - 所以您只需要单独构建每个构建的配置。我不确定是否可以单独选择编译而不是链接,或者它是否会在任何情况下这样做但值得一试(Keil uVision 允许这样做,所以也许 EWARM 也是如此)。
-
@user694733 也许我应该澄清我的问题。我问是否首先存在一个选项来执行此操作。考虑到另一个 IAR 产品 xlink 有这样一个选项,似乎应该存在一个选项。 __weak 关键字不是一个理想的选择,因为两个定义不能同时是弱的,否则我又回到了我开始的地方。它还涉及使用我必须对其他编译器隐藏的编译指示使代码混乱。
-
@clifford 我可以从构建中排除某些文件并将它们放入不同的配置中。但是,我已经有了三种构建配置,它们在优化、调试符号、诊断输出级别等方面代表不同的发布配置。添加它会使我必须管理的构建配置数量增加一倍。此外,我声明的目标之一是两个模块都应始终构建,以便对接口的更改不会使其中一个模块处于孤立状态。
-
“我的一个既定目标是两个模块都应该始终构建” 这是有道理的,但是:“添加它会使我拥有的构建配置数量翻倍管理” 如果不使用构建配置,您还会如何选择是使用 A 还是 B?您必须在某处拥有该信息。