简而言之:LLVM/Clang 是否支持“弱”属性?
我正在学习一些 Arduino 库资源(更详细的是 HardwareSerial.cpp),并且我发现了一些weak
我以前从未使用过的有趣属性:
#if defined(HAVE_HWSERIAL0)
void serialEvent() __attribute__((weak));
bool Serial0_available() __attribute__((weak));
#endif
我发现它很有趣,并且我读到如果未定义,链接器应将其设置为 NULL。
但是,在我对 Clang 的测试中,我无法使用它。
文件lib.cpp:
#include "lib.h"
#include <stdio.h>
void my_weak_func() __attribute__((weak));
void lib_func() {
printf("lib_func()\n");
if (my_weak_func)
my_weak_func();
}
文件lib.h:
#ifndef LIB_FUNC
#define LIB_FUNC
void lib_func();
#endif
文件main.cpp:
#include "lib.h"
#include <stdio.h>
#ifdef DEFINE_WEAK
void my_weak_func() {
printf("my_weak_func()\n");
}
#endif
int main() {
lib_func();
printf("finished\n");
return 0;
}
如果我使用g++ lib.cpp main.cpp -o main -DDEFINE_WEAK
我可以使用它:
MBA-Anton:Weak_issue asmirnov$ ./main
lib_func()
my_weak_func()
finished
但如果我使用g++ lib.cpp main.cpp -o main
我无法链接应用程序:
Undefined symbols for architecture x86_64:
"my_weak_func()", referenced from:
lib_func() in lib-ceb555.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
要更详细地了解 Clang:
MBA-Anton:Weak_issue asmirnov$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
我应该怎么办?weak
LLVM/Clang 是否支持该属性?
PS。我已经尝试以Apple 描述的方式重写lib.cpp并且仍然得到相同的链接器错误:
#include "lib.h"
#include <stdio.h>
extern void my_weak_func() __attribute__((weak_import));
void lib_func() {
printf("lib_func()\n");
if (my_weak_func != NULL)
my_weak_func();
}