Код: Выделить всё
void foo() __attribute__((weak));
Код: Выделить всё
#include "a.h"
#include
void foo() { printf("%s\n", __FILE__); }
Код: Выделить всё
#include
void foo() { printf("%s\n", __FILE__); }
Код: Выделить всё
#include "a.h"
#include
int main() { if (foo) foo(); else printf("no foo\n"); }
< /code>
Теперь, в зависимости от того, если я использую файлы *.o (g++ -c a.cКод: Выделить всё
ar cr a.o- prints b.c
Код: Выделить всё
g++ main.cpp a.o b.o - prints b.c
Код: Выделить всё
g++ main.cpp b.o a.o - prints нет foo
Код: Выделить всё
g++ main.cpp a.a b.a - Prints нет foo
Код: Выделить всё
g++ main.cpp b.a a.a
file a.h:
Код: Выделить всё
void foo();
Код: Выделить всё
#include "a.h"
#include
void __attribute__((weak)) foo() { printf("%s\n", __FILE__); }
< /code>
После этой модификации: < /p>
1) `g ++ main.cpp a.a b.a` prints [i] a.c < /i>
2)` g ++ main.cpp b.a a.a` prints b.c < /i>
показывает w _z3foov Слабый атрибут вызывает декларацию быть излучаемым как слабый символ, а не глобальный. Это в первую очередь полезно при определении библиотечных функций, которые могут быть переопределены в коде пользователя, хотя его также можно использовать с нефункциональными объявлениями. Слабые символы поддерживаются для целей ELF, а также для целей A.out при использовании ассемблера GNU и линкера. Является ли использование атрибута слабым в определении вместо объявления правильным? Без атрибута окончательный двоичный файл генерирует то же самое: < /p>
1) `g ++ main.cpp a.a b.a` prints a.c < /i>
2)` g ++ main.cpp b.a A.a` prints b.c < /i>
так просто является символом, а это так, что это то, что это связано с ними, так что это так, что это связано с именным, и это так, что это так, и это то, что это так же, что с ними. Поведение GCC по умолчанию. Несмотря на то, что `nm A.A 'показывает, что был излучен слабый символ, он, похоже, не влияет на статическое связывание.
можно ли использовать атрибут слабый со статическим связыванием вообще? Таким образом, самое простое решение, по -видимому, заключается в замене символа во время связывания с B (поскольку клиенты уже связываются с b).
Я знаю>
Подробнее здесь: https://stackoverflow.com/questions/516 ... -libraries
Мобильная версия