【问题标题】:Is it possible to declare a weak function by passing an argument to gcc?是否可以通过将参数传递给 gcc 来声明弱函数?
【发布时间】:2019-05-07 07:38:10
【问题描述】:

我们可以通过在 C 代码文件中使用 __attribute__((weak)) 来声明弱函数。我想知道是否有一种方法可以在 gcc 编译期间声明它而不在代码文件中写入任何内容?

例如

文件:foo.h

int foo();

文件:foo.c

#include<stdio.h>

int foo(){
   printf("foo called from file\n");
   return 1;
}

文件:main.c

#include<stdio.h>
#include"foo.h"
int foo(){
  printf("foo called from main");
  return 1;
} 

int main(){
  foo();
  return 0;
}

是否可以编译上述代码并将 foo 从命令行导出为弱?

例如gcc --weak=foo.c:foo foo.c main.c

./a.out produces foo called from main.

我知道在foo.c 中写__attribute__((weak)) 上面的foo() 声明会在main 中调用foo()

博客:

blog.microjoe.org/2017/unit-tests-c-cmocka-coverage-cmake.html

说可以这样做....

有两种声明弱符号的方式:

  1. 通过向 GCC 传递一个参数,告诉它将此函数的符号导出为弱符号。

  2. 通过在函数实现之前放置 attribute((weak)) 注释。

【问题讨论】:

    标签: c compilation linker weak-references


    【解决方案1】:

    我会说不,没有这样的选择。

    这听起来有点像XY-problem,也许您应该更清楚地说明您要解决的问题,而不是您想要解决的问题。

    顺便说一句,你的例子是行不通的,因为你提供了两个定义,而不是说哪个应该被认为是弱的。应该是

    # Remember this doesn't really work!
    $ gcc --weak=foo.c:foo foo.c main.c
    

    或其他什么,即您需要指出弱定义驻留在哪个文件中。

    【讨论】:

    • 我正在使用 cmocka 工具编写单元测试,其中我通过在测试文件中重新定义函数体来创建模拟函数。为了做到这一点,我将该函数声明为弱函数。例如。 application.c 包含声明为弱的函数 foo()。 test_application.c 也有一个 foo() 没有实现 [来自 application.c 的 foo() 的模拟] 和来自 test_application.c 的 main() 从 application.c 启动对 foo() 的单元测试我不想声明/显示我在应用程序文件中的功能很弱。从命令行传递可以让我实现这一目标。
    • 博客:blog.microjoe.org/2017/unit-tests-c-cmocka-coverage-cmake.html 说可以这样做.... """ 声明弱符号有两种方法:通过将参数传递给 GCC,告诉它导出将此函数的符号作为弱符号。通过在函数实现前加上__attribute__((weak))注解。"""
    • @VasuMistry 我会建议像博客文章这样的宏。请注意,它并没有说明如何使用 GCC 完成此操作,只是说明它可以完成。这可能是正确的,但我至少无法找到证据。
    • 它说使用DEBUG宏,如何使用?它是共享状态的整数吗?基本上如何打开和关闭调试?
    • @VasuMistry 它还说解决方案不是很好,最好使用TESTING 宏,然后#defined 成为正确构建中的相关attribute,来自 Makefile 或同等文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多