Статическая библиотека "Интерфейс" - PullRequest
4 голосов
/ 12 июля 2011

Есть ли способ сообщить компилятору (gcc / mingw32) при построении объектного файла (lib*.o), что он предоставляет только определенные функции из файла .c?
Причина, по которой я хочу это сделать, заключается в том, что я статически связываюсь с библиотекой из 100 000 строк (SQLite), но использую только некоторые из предлагаемых функций. Я надеюсь, что если я скажу компилятору выставлять только эти функции, он оптимизирует весь код функций, которые никогда не нужны для тех немногих, кого я выбрал, тем самым резко уменьшив размер библиотеки.

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Я нашел несколько возможных решений:

Это то, о чем я спрашивал. Это gcc эквивалент Windows 'dllexpoort:

Я также обнаружил генерацию кода времени соединения. Это позволяет компоновщику увидеть, какие части кода фактически используются, и избавиться от остальных. Использование этого вместе с strip и -fwhole-program дало мне значительно лучшие результаты.

Примечание: Этот флаг имеет смысл, только если вы не компилируете всю программу за один вызов gcc, что я и делал (создавал файл sqlite.o, а затем статически связывал его) .

Здесь упоминается третий вариант, который я нашел, но еще не изучил:

0 голосов
/ 16 июля 2011

Вероятно, это работа компоновщиков, а не компиляторов.Связывая это как программу (.exe), компоновщик будет заботиться только об импорте соответствующих символов, а при связывании DLL, вероятно, вам нужен механизм __dllexport, или вам могут помочь некоторые флаги ld (manл.д.).

...