2016-04-16 1 views
1

Предположим, что мы называемКак обрабатывать код, который поставляется дважды (в исходном файле и в библиотеке)?

gcc -Dmyflag -lmylib mycode.c 

где mylib содержит все mycode но компилируется без -Dmyflag. Таким образом, все функции и другие объекты, реализованные в mycode, доступны в двух версиях загрузчика. Эмпирически, я нахожу, что версия от mycode взята. Могу ли я на это положиться? Будет mycode всегда перезаписывать mylib?

ответ

1

Эмпирически, я нахожу, что версия из mycode взята.

Читать this explanation как компоновщик работает с архивными библиотеками, и, возможно, this one.

Могу ли я положиться на это?

Вы должны положиться на понимание того, как это работает.

Если вы поняли материал в ссылочных ссылках, вы будете наблюдать, что добавление main к libmylib.a будет инвертировать ответ (и если mycode.c также содержит main, вы получите дубликат ошибку определения символа).

Если вы используете динамическую библиотеку libmylib.so, правила различны, и библиотека всегда будет проигрывать основной двоичный файл, хотя есть много осложнений, такие как LD_PRELOAD, связывая библиотеку с -Bsymbolic и др.

Короче говоря, вы должны предпочесть не сделать это вообще.

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