Как уменьшить размер файла скомпилированного общего объекта g ++? - PullRequest
1 голос
/ 05 октября 2011

У меня есть файл общего объекта (.so), скомпилированный с g ++, в Windows, его размер около 2 МБ (.DLL, скомпилированный с Visual Studio 2008, / O2), но в Linux его размер составляет 10 МБ, если скомпилирован с g ++ -O2 флаг.

Даже если я скомпилирую его с флагом -Os, окончательный размер файла .so по-прежнему будет 5 МБ.

Я знаю, что исполняемый файл может быть уменьшен командой strip, но он, похоже, не работает с .so файлом (его можно удалить, но не удается загрузить).

Как я могу уменьшить размер файла этого общего объекта? Есть ли какие-либо команды раздевания для общего объекта?

Edit1:

Моя версия g ++ - 4.1.2. Я использую Boost 1.43 в своем коде.

Флаги компиляции в моем make-файле:

g++ -DNDEBUG -D_PYTHON -DBOOST_PYTHON_STATIC_LIB -I"boost_1_43_0" -I"/usr/local/include/python2.6" -fno-tree-vrp -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"

Флаги ссылок:

LIBS := -lm -lz -ltidy -lpng14 -lxml2 -liconv -lboost_regex-gcc41-mt-s -lboost_serialization-gcc41-mt-s -lboost_python-gcc41-mt-s -lpython2.6

Вот ldd для моего общего объекта:

linux-gate.so.1 =>  (0x00327000)
libz.so.1 => /lib/libz.so.1 (0x004f4000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00110000)
libm.so.6 => /lib/libm.so.6 (0x00f31000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0053b000)
libc.so.6 => /lib/libc.so.6 (0x00328000)
/lib/ld-linux.so.2 (0x0077d000)

Я попытаюсь использовать флаг -fno-inline, но мне было интересно, что это повлияет на производительность скомпилированного кода.

Я сомневаюсь, что это потому, что я статически связываюсь с Python 2.6? В моем ldd должен быть libpython2.6.so, но я его не вижу.

Что-то не так в моей ссылке или флагах компиляции?

1 Ответ

1 голос
/ 06 октября 2011

Похоже, что эти внешние библиотеки статичны, они включены в вашу библиотеку. Я подозреваю это, потому что ldd не показывает ссылку на них, и это частая причина огромных исполняемых файлов.

Опция -static linker в g ++ может вызвать эту проблему, или, возможно, библиотеки, которые вы связываете, доступны только как статические библиотеки.

...