LINUX.ORG.RU

как правильно линковать в make?

 


1

2

есть пакет в Debian из репозитория libssh2-1 создающий в /usr/lib/x86_64-linux-gnu/
соответственно
libssh2.a
libssh2.so
libssh2.so.1
libssh2.so.1.0.1

он кривой, скачал с исходника последнуюю версию, сделал конфиг и мейк, без мейк инсталл, как прилинковать эту библиотеку при компиляции, т.к. то что делаю ниже все равно почему то тянет старую версию, приходится просто подменять файл libssh2.so.1.0.1 в /usr/lib/x86_64-linux-gnu/

g++ -o AddWork AddWork.cpp -L./ibpp/core -lfbclient -libpp -DIBPP_LINUX -L./libssh2-1.8.2/src -lssh2-1.8.2-ssl-dbg
★★★

похоже проблема не в линке, а в запуске ) надо путь до библиотеки новой прописывать при запуске

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

export LD_PRELOAD=адрес до либы решило проблему )

wolverin ★★★
() автор топика

все равно почему то тянет старую версию

Статически слинкуй и проблем не будет:

g++ -o AddWork path/to/libssh2/libssh2.a AddWork.cpp -L./ibpp/core -lfbclient -libpp -DIBPP_LINUX
Deleted
()
Ответ на: комментарий от anonymous

anonymous

чтоб знать какой версии и как собрано, иба штатная на libgcrypt и без дебага, плюс кривая версия в репозитории

wolverin ★★★
() автор топика
Ответ на: комментарий от Deleted

zvezdochiot

что то статическая линковка не прокатывает, возникают ошибки undefined reference, которых нет при динамической линковке

wolverin ★★★
() автор топика
Ответ на: комментарий от kickass

kickass

зачем? динамическая линковка и так работает

wolverin ★★★
() автор топика
Ответ на: комментарий от Deleted

zvezdochiot

ну как бэ обычный выхлоп о не найденном описании

при динамической линковке ошибок нет

wolverin$ g++ -o AddWork ./libssh2-1.8.2/src/.libs/libssh2.a AddWork.cpp -L./ibpp/core -lfbclient -libpp -DIBPP_LINUX
/tmp/ccGeFPjG.o: In function `CSSH2::ErrorSSH(char const*, int)':
AddWork.cpp:(.text._ZN5CSSH28ErrorSSHEPKci[_ZN5CSSH28ErrorSSHEPKci]+0x2e): undefined reference to `libssh2_session_last_error'
AddWork.cpp:(.text._ZN5CSSH28ErrorSSHEPKci[_ZN5CSSH28ErrorSSHEPKci]+0x38): undefined reference to `libssh2_version'
/tmp/ccGeFPjG.o: In function `CSSH2::~CSSH2()':
AddWork.cpp:(.text._ZN5CSSH2D2Ev[_ZN5CSSH2D5Ev]+0x7a): undefined reference to `libssh2_channel_free'
AddWork.cpp:(.text._ZN5CSSH2D2Ev[_ZN5CSSH2D5Ev]+0xa7): undefined reference to `libssh2_session_disconnect_ex'
AddWork.cpp:(.text._ZN5CSSH2D2Ev[_ZN5CSSH2D5Ev]+0xb7): undefined reference to `libssh2_session_free'
/tmp/ccGeFPjG.o: In function `CSSH2::CreateTunnel(char const*)':
AddWork.cpp:(.text._ZN5CSSH212CreateTunnelEPKc[_ZN5CSSH212CreateTunnelEPKc]+0x183): undefined reference to `libssh2_session_init_ex'
AddWork.cpp:(.text._ZN5CSSH212CreateTunnelEPKc[_ZN5CSSH212CreateTunnelEPKc]+0x1cc): undefined reference to `libssh2_session_startup'
AddWork.cpp:(.text._ZN5CSSH212CreateTunnelEPKc[_ZN5CSSH212CreateTunnelEPKc]+0x23b): undefined reference to `libssh2_userauth_publickey_fromfile_ex'
/tmp/ccGeFPjG.o: In function `CSSH2::ConnectTunnel()':
AddWork.cpp:(.text._ZN5CSSH213ConnectTunnelEv[_ZN5CSSH213ConnectTunnelEv]+0xcf): undefined reference to `libssh2_channel_direct_tcpip_ex'
AddWork.cpp:(.text._ZN5CSSH213ConnectTunnelEv[_ZN5CSSH213ConnectTunnelEv]+0x128): undefined reference to `libssh2_session_set_blocking'
collect2: error: ld returned 1 exit status

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin
wolverin$ g++ -o AddWork ./libssh2-1.8.2/src/.libs/libssh2.a AddWork.cpp -L./ibpp/core -lfbclient -libpp -DIBPP_LINUX

Уже давным-давно в линкере по умолчанию используется режим --as-needed. Как результат, чтобы при однопроходной линковке всё находилось, надо в вызове линкера соблюдать определённый порядок: сначала объектники/исходники самой программы, потом — библиотеки:

wolverin$ g++ -o AddWork AddWork.cpp ./libssh2-1.8.2/src/.libs/libssh2.a -L./ibpp/core -lfbclient -libpp -DIBPP_LINUX

akk ★★★★★
()
Ответ на: комментарий от akk

akk

так я тоже пробовал, но ошибки undefined reference хоть и другие, но уже не влазят на страницу

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

обычный выхлоп о не найденном описании

Фига себе. Они в архиве походу так расположены, что ли? Убедись, что они есть в архиве:

objdump -x ./libssh2-1.8.2/src/.libs/libssh2.a | grep "ставишь сюда определение"

Если есть, то:

не собирается (не компилируется) clamav-0.101.1 под Centos 5 (x86) с либой zlib-1.2.11 (комментарий)

Deleted
()
Ответ на: комментарий от wolverin

ну как бэ обычный выхлоп о не найденном описании

Всё, понял. Надо хедеры притянуть:

g++ -I./libssh2-1.8.2/src/include ...

Путь скорректируешь.

Или в AddWork.cpp инклюды подправить.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Deleted

zvezdochiot

вот так собралось

g++ -o AddWork AddWork.cpp ./libssh2-1.8.2/src/.libs/libssh2.a -L./ibpp/core -lfbclient -libpp -DIBPP_LINUX -lpthread -lssl -lcrypto -lz

может логично тогда и libssl и libcrypto и libz слинковать статично в проект!?

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

может логично тогда и libssl и libcrypto и libz слинковать статично в проект!?

Лишнее. Они у тебя расположены там, где положено. Проблема была только с libssh2 (точнее в её расположении) и ты её решил. Хорош.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.