使函数具有全局范围,如编译器固有的

问题描述

我使用的是arm编译器上固有的函数,而不是GCC上固有的函数(即arm的__strex)。我将strex函数用作内联函数的一部分。使用arm编译器可以正常工作。我有两个项目,目标使用arm编译器,测试项目使用GCC。使用GCC,我无法将其与我尝试过的许多变通方法一起编译。我一直无法获得范围内的变量。由于该函数是内联函数,这意味着目标文件期望该函数位于该文件的范围内。我不想修改目标以包括仅测试项目即可编译的头文件。是否可以通过链接器或编译器属性/某种方式来创建函数,而该方法/行为类似于内部函数,在整个代码库中具有全局作用域?

解决方法

我不想修改目标[文件]以包含仅测试项目编译所需的头文件。

您不需要修改它。使用-include some/header/file.h GCC标志以非侵入方式包括额外的标头。

然后您可以制作函数inline并将其放入标题中,或在其他位置进行定义。

,

需要要声明的函数,编译器才能内联它。如果出于某种原因您不想修改任何源代码,请使用来修改您的构建以使用命令行选项进行编译。

如果可以将预处理器选项定义为CPP宏,则可能是像-D__strex=something这样的预处理器选项。

或更可能使用GCC的-include foo.h option来包含.h,以提供对所需的任何内在函数的正确定义。 (默认情况下,它搜索#include "..."路径,而不是#include <...>)。

-include file

处理文件,就好像“ #include“ file”“作为主源文件的第一行出现一样。但是,搜索的第一个目录 文件是预处理程序的工作目录,而不是包含主源文件的目录。如果在那儿找不到 照常在“ #include“ ...”“搜索链的其余部分中搜索。


GCC确实具有某些指令的内在函数。但是,有关LL / SC指令(例如strex)的IDK;这很棘手,因为在{em}和ldrex之间放置 时有一定的限制,而不会使其始终失败。如果调试模式进行了额外的加载/存储,则它们之间具有任意C的固有特性可能导致代码只能在发布模式下工作。

例如https://github.com/ARMmbed/core-util/issues/76建议项目远离这些内在函数,并使用GNU C strex内置函数。考虑自己做同样的事情,例如使用__atomic代替手册__atomic_add_fetch__ldrex https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html