In Kürze: unterstützt llvm
/clang
'schwach' Attribut?Unterstützt llvm/clang das Attribut 'weak' für schwache Links?
Ich lerne einige Arduino Bibliothek Quellen (HardwareSerial.cpp ausführlichere zu sein), und ich habe einige interessante Attribut weak
gefunden, dass ich nie benutzt habe vor:
#if defined(HAVE_HWSERIAL0)
void serialEvent() __attribute__((weak));
bool Serial0_available() __attribute__((weak));
#endif
ich habe es gefunden interessant und ich habe gelesen, dass Linker sollte es auf NULL setzen, wenn es nicht definiert ist.
In meinen Tests mit clang
kann ich es jedoch nicht verwenden.
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;
}
wenn ich g++ lib.cpp main.cpp -o main -DDEFINE_WEAK
verwende ich bin in der Lage, es zu benutzen:
MBA-Anton:Weak_issue asmirnov$ ./main
lib_func()
my_weak_func()
finished
aber wenn ich g++ lib.cpp main.cpp -o main
verwende ich bin nicht in der Lage, die App zu verknüpfen:
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)
über Klirren detaillierteren Um:
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
Was soll ich tun? Wird weak
Attribut von llvm/clang unterstützt?
PS. Ich habe bereits versucht lib.cpp in die Art und Weise Apple describes und immer noch die gleichen Linker-Fehler neu zu schreiben:
#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();
}
Welche Version von xcode verwenden Sie ('xcodebuild -version')? Und welche Version von OSX ('sw_vers')? – Alec
MBA-Anton: avr-clang asmirnov $ xcodebuild -version Xcode 7.2 Build-Version 7C68 – 4ntoine