In brief: does LLVM/Clang support the 'weak' attribute?
I'm learning some Arduino library sources (HardwareSerial.cpp to be more detailed) and I've found some interesting attribute weak
that I've never used before:
#if defined(HAVE_HWSERIAL0)
void serialEvent() __attribute__((weak));
bool Serial0_available() __attribute__((weak));
#endif
I've found it interesting and I've read that the linker should set it to NULL if it's not defined.
However, in my tests with Clang I'm unable to use it.
File 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();
}
File lib.h:
#ifndef LIB_FUNC
#define LIB_FUNC
void lib_func();
#endif
File 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;
}
If I use g++ lib.cpp main.cpp -o main -DDEFINE_WEAK
I'm able to use it:
MBA-Anton:Weak_issue asmirnov$ ./main
lib_func()
my_weak_func()
finished
But if I use g++ lib.cpp main.cpp -o main
I'm unable to link the application:
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)
To be more detailed about 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
What should I do? Is the weak
attribute supported by LLVM/Clang?
PS. I've already tried to rewrite lib.cpp in the way Apple describes and still get the same linker error:
#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();
}