我有一个模块化的C项目,其中包含一些不同的库/对象,只有在满足某些条件时才会链接到发布版。该项目使用GCC 3.4.4 for PowerPC构建。
因此,在我的整个项目中,有一些C文件使用其他模块的函数(这些模块不一定添加到构建中)。因此,这些函数被声明为extern。
根据发布版本,包含函数本身的模块会被链接或不链接。为了避免未定义的引用,这些函数被声明为弱函数,并使用汇编宏。
我试图通过以下示例来说明:
ModuleA.c(核心模块)
ModuleB并不总是与ModuleA链接在一起,只有在一些特定的发布版本中才会链接。因此,存在第三个C文件。
weakfuncs.c(核心模块)
使用此宏,项目始终构建(如果链接了ModuleB,则将从ModuleB调用
由于整个项目中存在许多这些情况,我的前任正在收集所有这些函数并将其放在
到目前为止,这是遗留代码,我只是在重复使用。
现在我想使用MinGW(GCC 4.8.1)为Windows编译整个项目。我的问题是编译器似乎无法处理汇编指令:
WEAK宏本身
因此,在我的整个项目中,有一些C文件使用其他模块的函数(这些模块不一定添加到构建中)。因此,这些函数被声明为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文件。
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()
。由于整个项目中存在许多这些情况,我的前任正在收集所有这些函数并将其放在
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");
编译没有问题,但是没有效果,即未连接的函数会导致“undefined reference”错误,即使我已经在它们上面运行了WEAK宏。
现在我知道在gcc中有一种方法可以像这样给函数赋予弱属性:
extern void bar() __attribute__((weak));
这个实际上是可行的,但是由于有很多函数都需要适应,我更喜欢用宏在我的 weakfuncs.c
中来完成。
有没有汇编指令或C语言的方法来做到这一点,而不必改变所有地方的函数声明?
b lr
,对于ARM CPU来说需要一个空格。 - undefined