2010-04-13 3 views
4

я объявленным внешнюю функцию со слабым атрибутом GCC в .c файле:Слабая связь со статическими библиотеками

extern int weakFunction() __attribute__ ((weak)); 

скомпилированный файл объекта weakFunction, определенных как слабый символ. Выход нм:

1791:   w weakFunction 

Я зову слабую определенную функцию следующим образом:

if (weakFunction != NULL) 
{ 
    weakFunction(); 
} 

Когда я связать программу определения объектных файлов в качестве параметров GCC (gcc main.o weakf.o -o main.exe) слабые символы работать нормально , Если я покину слабый сигнал.o из ссылки, адрес функции будет NULL в main.c, и функция не будет вызываться.

Проблема в том, что, когда weakf.o находится внутри статической библиотеки, по какой-либо причине компоновщик не находит эту функцию, и адрес функции всегда заканчивается как NULL. Статическая библиотека создана с ar: ar rcs weaklibrary weakf.o

У кого-нибудь были подобные проблемы?

ответ

3

Хотя я не знаю точной работы слабых символов, похоже, что вы получаете то, о чем вы просите: если никто другой не заставляет слабую функцию() присутствовать, main() тоже не будет. Для меня это имеет смысл: если вы пытаетесь написать код, который работает с объектом X, а также без него, то вы не хотите, чтобы ваш код заставлял X быть включенным в вашу сборку любой ценой. Похоже, что «слабый» должен спросить , если что-то есть, не просить , что что-то присутствует. Возможно, вы можете принудительно включить слабые символы с «-u weakFunction» в качестве опции компоновщика в вашем случае.

+0

Спасибо, эта информация помогла. Пока я буду использовать параметр -whole-archive, пока не найду лучший способ привязки символов. Параметр -u не работал :( –

+0

Я должен сказать, -u работает на моем примере –

Смежные вопросы