要約:/clang
は '弱い'属性をサポートしていますか?弱リンクの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)
を:
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
私は何をすべき? llvm/clangはweak
属性をサポートしていますか?
PS。 (私が言うことができるように最善)は、弱いリンクのAppleの説明は誤解を招くようです
#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();
}
どのxcodeのバージョンを使用していますか( 'xcodebuild -version')? OSXのどのバージョン( 'sw_vers')? – Alec
MBA-Anton:avr-clang asmirnov $ xcodebuild -version Xcode 7.2 ビルドバージョン7C68 – 4ntoine