我有一个带有一些不同库/对象的模块化C-Project,如果满足某些条件,它们只链接到该版本。该项目使用GCC 3.4.4为PowerPC构建。
所以在我的项目中,有一些C-Files使用来自其他模块的函数(这些模块不一定被添加到构建中)。所以这些函数被声明为extern。
根据版本的不同,包含功能本身的模块是否链接。为了避免未定义的引用,使用汇编程序宏将这些函数声明为弱。
我试图用一个例子来证明这一点:
ModuleA.c(核心模块)
extern void bar(void);
void foo(void)
{
// Do some Stuff
bar();
}
ModuleB.c(可选模块)
void bar(void)
{
// Do some stuff
}
ModuleB并不总是链接到ModuleA,仅在某些特定的版本构建中。所以有第三个C-File
weakfuncs.c(核心模块)
#define WEAK(x,y) __asm__(".weak " #x "\n.set " #x "," #y "\n");
void empty_function(void);
__asm__("empty_function:\nblr\n");
WEAK(bar,empty_function)
使用此宏,项目始终构建(如果ModuleB已链接,将从ModuleB调用bar()
,如果未链接ModuleB,bar()
将仅调用empty_function()
。< / p>
由于整个项目中有很多这些案例,我的前任正在weakfuncs.c
收集所有这些功能。
到目前为止,这是我只是重用的遗留代码
现在我想用MinGW(GCC 4.8.1)为Windows编译整个东西。 我的问题是编译器似乎有汇编指令的问题:
__asm__("empty_function:\nblr\n");
根本不工作(他不知道blr
命令),但这不是问题,因为我可以像这样在C中实现一个空函数:
void empty_function(void)
{
return;
}
WEAK宏本身
#define WEAK(x,y) __asm__(".weak " #x "\n.set " #x "," #y "\n");
编译没有问题,但它没有效果,这意味着,未链接的函数会导致“未定义的引用”,即使我在它们上面运行了WEAK宏。
现在我知道gcc中有一种方法可以为函数赋予弱的属性:
extern void bar() __attribute__((weak));
这实际上有效,但由于有很多功能都需要进行调整,我宁愿在我的weakfuncs.c
中用宏来做。
是否有任何汇编程序指令或C中的方法这样做,而不是在整个placE中查找所有函数的变换?
答案 0 :(得分:1)
这个怎么样?
void empty_function(void)
{
return;
}
#define WEAK(x,y) extern void x() __attribute__((weak, alias(#y)));