gpt4 book ai didi

IAR EWARM 中的条件链接

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:15 28 4
gpt4 key购买 nike

我正在使用 IAR EWARM 8.10.1,它使用 ILINK 链接器。

我有两个编译单元使用的公共(public) header 。它包括具有外部链接的功能原型(prototype),并构成一个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。我希望两个模块都能编译。如果有人对接口(interface)和 module_A 进行了更改,但未能更新 module_B,我希望他们得到一个编译器错误。这将防止 module_B 随着接口(interface)的发展而进入某些孤立和损坏的状态,并且我们的注意力集中在 module_A 上。

我查看了 EWARM_DevelopmentGuide.ENU.pdf,但找不到似乎可以满足我要求的命令行选项。我想知道是否存在这样的选项但我错过了它,或者是否有另一种方法可以实现我所追求的目标。

最佳答案

这并不是一个完整的答案,因为我没有像您那样的新版本的编译器,而是更多可能的解决方法。

Module_A.c

#if MODULE_A_SELECTED
#define MY_WEAK
#else
#define MY_WEAK __weak
#endif

MY_WEAK void foo(void) { ... }
...

Module_B.c

#if MODULE_B_SELECTED
#define MY_WEAK
#else
#define MY_WEAK __weak
#endif

MY_WEAK void foo(void) { ... }
...

然后您可以根据需要在配置中定义 MODULE_*_SELECTED

关于IAR EWARM 中的条件链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54990942/

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