Я объявил внешнюю функцию со слабым атрибутом GCC в файле .c:
extern int weakFunction( ) __attribute__ ((weak));
Скомпилированный объектный файл имеет weakFunction, определенный как слабый символ. Выход нм:
1791: w weakFunction
Я вызываю слабо определенную функцию следующим образом:
if (weakFunction != NULL)
{
weakFunction();
}
Когда я связываю программу, определяя объектные файлы в качестве параметров для GCC (gcc main.o weakf.o -o main.exe
), слабые символы работают нормально. Если я оставлю weakf.o вне линковки, адрес функции будет NULL в main.c и функция не будет вызываться.
Проблема в том, что когда weakf.o находится внутри статической библиотеки, по какой-то причине компоновщик не находит функцию, и адрес функции всегда оказывается равным NULL. Статическая библиотека создается с помощью ar: ar rcs weaklibrary weakf.o
У кого-нибудь были подобные проблемы?