是否可以通过将参数传递给gcc来声明弱函数?

时间:2019-05-07 07:38:10

标签: c compilation linker weak-references

我们可以在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.

我知道在__attribute__((weak))的{​​{1}}声明上方写上foo()会在主体中调用foo.c

博客:

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

说有可能这样做。...

  

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

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

  2.   
  3. 通过在函数实现之前添加属性((弱))注释。

  4.   

1 个答案:

答案 0 :(得分:0)

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

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

顺便说一句,您的示例不起作用,因为您提供了两个定义,而没有说哪个应该被认为是弱的。一定是

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

之类的东西,即您需要指出弱定义所在的文件。