Hey, guys.
Before creating a bug report i’d like to know if i’m doing this correct or not.
Originally it’s my SO question but feel free to repond here or on SO.
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 linker should set it to NULL if it’s not defined.
However in my tests with clang
i’m unable to use it.
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;
}
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 app:
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 weak
attribute supported by llvm/clang?
PS. I’ve already tried to rewrite lib.cpp in the way Apple describes and still 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();
}