У меня есть файл общего объекта (.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, но я его не вижу.
Что-то не так в моей ссылке или флагах компиляции?