Привет!
Написал программу на C++, которая линкуется так:
g++ -fPIC -MD -Wall -Wno-format-y2k -Wno-sign-compare -pthread
-O3 -DNDEBUG
-L/usr/local/dev/boost/lib
-L/usr/local/dev/loki/lib
-L/usr/local/dev/ace/lib
-L/usr/local/dev/zlib/lib
-L/usr/local/dev/server_utils_ng/lib
-L/usr/local/dev/oragate_ng/lib
-lloki -lACE -lz -lserver_utils_ng -loragate_ng
-lboost_program_options-mt -lboost_regex-mt
-o thd cache.o main.o
Вывод "ldd -u -r" вызывает некоторые подозрения:
ldd -u -r thd
Unused direct dependencies:
/usr/local/dev/loki/lib/libloki.so.0.1.6
/lib/libz.so.1
/usr/local/dev/boost/lib/libboost_regex-gcc41-mt-1_35.so.1.35.0
/lib/libm.so.6
Стал гуглить и нашел статью Дреппера "How to write shared libraries",
в которой говорится:
To determine whether an executable or DSO has such unnecessary
dependencies the ldd script can be used:
$ ldd -u -r \
/usr/lib/libgtk-x11-2.0.so.0.600.0
Unused direct dependencies:
/usr/lib/libpangox-1.0.so.0
/lib/libdl.so.2
These references can be manually eliminated by avoiding
to name the DSO on the linker command line.
Alternatively the --as-needed linker option can be used.
If this option is used, all DSOs named on the command line
after the option are only added to the dependency list if
they are really needed. This mode can be disabled again
with the --no-as-needed option. This way the lazy
programmer can still name all the DSOs which might be
needed at all times. The linker does all the hard work.
Решил попробовать и обернул -lloki следующим образом:
-Wl,--as-needed -lloki -Wl,--no-as-needed
Вот что получилось:
ldd -u -r thd
Unused direct dependencies:
/lib/libz.so.1
/usr/local/dev/boost/lib/libboost_regex-gcc41-mt-1_35.so.1.35.0
/lib/libm.so.6
После этого я решил аналогично обернуть -lz и вышло следующее:
g++ -fPIC -MD -Wall -Wno-format-y2k -Wno-sign-compare -pthread
-O3 -DNDEBUG
-L/usr/local/dev/boost/lib
-L/usr/local/dev/loki/lib
-L/usr/local/dev/ace/lib
-L/usr/local/dev/zlib/lib
-L/usr/local/dev/server_utils_ng/lib
-L/usr/local/dev/oragate_ng/lib
-Wl,--as-needed -lloki -Wl,--no-as-needed -lACE
-Wl,--as-needed -lz -Wl,--no-as-needed
-lserver_utils_ng -loragate_ng -lboost_program_options-mt -lboost_regex-mt
-o thd cache.o main.o
/usr/local/dev/oragate_ng/lib/liboragate_ng.so: undefined reference to `inflate'
/usr/local/dev/oragate_ng/lib/liboragate_ng.so: undefined reference to `inflateInit_'
/usr/local/dev/oragate_ng/lib/liboragate_ng.so: undefined reference to `inflateEnd'
collect2: ld returned 1 exit status
То есть zlib все же нужен (как и ожидалось), но тогда почему
"ldd -u -r" считает иначе?
Причем в случае с Loki команда ldd не соврала :)
Кто может объяснить в чем дело?
Ответ на:
комментарий
от Krivenok_Dmitry

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум boost::asio segmentation fault (2016)
- Форум kdelibs некомпилируется после установки nvidia драйверов для 2.6.x (2004)
- Форум Помогите собрать florb. (2020)
- Форум Ошибки при сборке CrossOver Office 3.0.1 из исходников (2004)
- Форум SQUID FATAL: The ssl_crtd helpers are crashing too rapidly, need help! (2017)
- Форум RPM 4.1 не компилится (2003)
- Форум RPM 4.1 не компилится (2003)
- Форум Установка SP-Forth (2009)
- Форум Компилятор ищет пути библиотек не там, куда я ему указал (2017)
- Форум libiconv – PROBLEMS (2007)