2013-05-02 5 views
6

Я пытаюсь скомпилировать проект. Он успешно компилируется. Мои команды make выходят со статусом 0 и ошибок не отображается.ldd говорит, что библиотека не найдена компиляцией успешно завершена

Однако проект не работает, и когда я запустил ldd -d <file>, он показывает, что у меня есть две библиотеки, которые не найдены.

>ldd -d output_file.so 
    linux-gate.so.1 => (0xf77e0000) 
    libvstdlib_srv.so => not found 
    libtier0_srv.so => not found 
    libm.so.6 => /lib/libm.so.6 (0xf7760000) 
    libdl.so.2 => /lib/libdl.so.2 (0xf775b000) 
    libc.so.6 => /lib/libc.so.6 (0xf75a9000) 
    /lib/ld-linux.so.2 (0x46e4a000) 
undefined symbol: pfVectorNormalize  (output_file.so) 
undefined symbol: _Z12VectorAnglesRK6VectorR6QAngle  (output_file.so) 
undefined symbol: pfSqrt  (output_file.so) 
undefined symbol: __cxa_guard_acquire (output_file.so) 
undefined symbol: __cxa_guard_release (output_file.so) 
undefined symbol: _Z6ConMsgPKcz (output_file.so) 
undefined symbol: Warning  (output_file.so) 
undefined symbol: __dynamic_cast  (output_file.so) 
undefined symbol: _Z11ConColorMsgRK5ColorPKcz (output_file.so) 
undefined symbol: Error (output_file.so) 
undefined symbol: AssertValidStringPtr (output_file.so) 
undefined symbol: _AssertValidWritePtr (output_file.so) 
undefined symbol: _AssertValidReadPtr (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv121__vmi_class_type_infoE  (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE  (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE (output_file.so) 
undefined symbol: __gxx_personality_v0 (output_file.so) 

Эти две библиотеки создаются как символические ссылки на фактическое местоположение файла:

... 
lrwxrwxrwx 1 Andy Andy 62 May 2 12:30 libtier0_srv.so -> /home/dev/sdks/hl2sdk-ob-valve/lib/linux/libtier0_srv.so 
lrwxrwxrwx 1 Andy Andy 64 May 2 12:30 libvstdlib_srv.so -> /home/dev/sdks/hl2sdk-ob-valve/lib/linux/libvstdlib_srv.so 
-rw-r--r-- 1 Andy Andy 5444 May 2 11:53 Makefile 
... 

gcc команда бежится является

gcc -I/home/dev/sdks/hl2sdk-ob-valve/public/game/server -I. -I.. -ICEntity -Isdk -I/home/dev/project1/hl2sdk-ob-valve/public -I/home/dev/sdks/hl2sdk-ob-valve/public/engine -I/home/dev/sdks/hl2sdk-ob-valve/public/tier0 -I/home/dev/sdks/hl2sdk-ob-valve/public/tier1 -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlib -I/home/dev/project1/mmsource-central/core -I/home/dev/project1/mmsource-central/core/sourcehook -I/home/dev/project1/sourcemod-central/public -I/home/dev/project1/sourcemod-central/public/sourcepawn -I/home/dev/project1/sourcemod-central/core project1_output/sdk/smsdk_ext.o project1_output/extension.o project1_output/CTrackingProjectile.o project1_output/CSentryRocket.o project1_output/CProjectileRocket.o project1_output/CProjectileArrow.o project1_output/CProjectileFlare.o project1_output/CProjectilePipe.o project1_output/CProjectileSyringe.o project1_output/CEntity/CEntity.o project1_output/CEntity/CEntityManager.o project1_output/CEntity/CPlayer.o /home/dev/project1/hl2sdk-ob-valve/lib/linux/tier1_i486.a libvstdlib_srv.so libtier0_srv.so -m32 -lm -ldl -static-libgcc -shared -o project1_output/output_file.so

Мои вопросы: 1.) Почему эти две библиотеки не найдены, хотя они символически связаны? 2.) Неопределенные символы являются частью пакета mathlib, который включен в команду gcc. -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlib Почему они не определены, несмотря на то, что они включены?

c++ не является моим языком выбора, и я достаточно знаю о Makefiles, чтобы быть опасным, но на самом деле ничего не исправлять, поэтому приношу свои извинения, если этого недостаточно. Я могу предоставить больше по мере необходимости.

+1

В качестве примечания стороны, SDK _really_ размещен в '/ dev'? –

+0

@JoachimIsaksson Нет! Я скрывал пути и даже не думал о '/ dev'. Я обновил вопрос, чтобы использовать '/ home/dev', поэтому это никого не смущает. – Andy

ответ

5

Файлы библиотеки являются общими объектами, что означает, что они не будут разрешены до запуска. Для того, чтобы ldd их находил (предполагая Linux или другой вариант Unix), вам нужно будет добавить путь к библиотекам в ваш LD_LIBRARY_PATH (есть другой путь env, который можно использовать, но я не могу думать об этом прямо сейчас), а затем ldd должен иметь возможность находить библиотеку.

2

Как сказал diverscuba23, вам нужно добавить путь, по которому ваша библиотека находится на вашем LD_LIBRARY_PATH. Легко, и не постоянный способ сделать это указать его при запуске программы, как так:

LD_LIBRARY_PATH =.:$LD_LIBRARY_PATH ./yourProgram 

В этом случае библиотека должны были бы находиться в том же каталоге, вы запустившего программу.

11

Я просто наткнулся на это, имел ту же проблему, но другое решение.

Использование LD_LIBRARY_PATH действительно будет работать. И это нормально, если это для вашего собственного тестирования в вашей среде сборки, но вы должны попытаться избежать этого, кроме того, для такого случая. Вот статья кем-то, кто знает гораздо больше, чем мне об этом, почему LD_LIBRARY_PATH плохо:

http://xahlee.info/UnixResource_dir/_/ldpath.html

Случившееся, как можно видеть из того факта, что установка LD_LIBRARY_PATH работал, является то, что во время выполнения , ваша программа не могла найти общую библиотеку libtier0_srv.so. Вместо того, чтобы глобально устанавливать переменную для всех программ, чтобы посмотреть на /home/dev/sdks/hl2sdk-ob-valve/lib/linux/, сначала вы должны добавить каталог в путь поиска библиотеки времени выполнения. Вы можете сделать это путем передачи опции

-rpath /home/dev/sdks/hl2sdk-ob-valve/lib/linux/

к ld линкер.Вы можете сделать это с помощью команды gcc вы в курсе, добавив опцию

-Wl,-rpath,/home/dev/sdks/hl2sdk-ob-valve/lib/linux/,

, который говорит gcc передать параметр выше для ld.

+0

Да, это лучше, чем подход «кувалды» для установки переменной окружения. – drlolly

Смежные вопросы