При связывании динамической библиотеки C ++ неудачная привязка символов - PullRequest
3 голосов
/ 24 июля 2010

Я пишу dylib на C ++, но когда я пытаюсь связать его с моим приложением, он выдает ошибку при выполнении:

dyld: lazy symbol binding failed: Symbol not found: __ZN8Vector2DC1Ev
  Referenced from: /Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug/Singularity Test App
  Expected in: /Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug/libSingularity.dylib

dyld: Symbol not found: __ZN8Vector2DC1Ev
  Referenced from: /Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug/Singularity Test App
  Expected in: /Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug/libSingularity.dylib

Я убедился, что символ не удален,и

nm -g libSingularity.dylib  | grep "T" | grep __ZN8Vector

сообщает, что в библиотеке присутствует символ:

0000000000006df6 T __ZN8Vector2DC1Eff
0000000000006d98 T __ZN8Vector2DC1Ev
0000000000006dc2 T __ZN8Vector2DC2Eff
0000000000006d6e T __ZN8Vector2DC2Ev

Я создаю ссылки изнутри XCode, поэтому команды ссылки довольно странные.Вот команда компоновщика для dylib:

Ld "/Users/noahz/Desktop/Singularity/Singularity Engine/build/Debug
    /libSingularity.dylib" normal x86_64
cd "/Users/noahz/Desktop/Singularity/Singularity Engine"
setenv MACOSX_DEPLOYMENT_TARGET 10.6
/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -isysroot /Develope
    /SDKs/MacOSX10.6.sdk "-L/Users/noahz/Desktop/Singularity/Singularity Engine/build
    /Debug" "-F/Users/noahz/Desktop/Singularity/Singularity Engine/build/Debug"
    -filelist "/Users/noahz/Desktop/Singularity/Singularity Engine/build/Singularity 
    Engine.build/Debug/Singularity Engine.build/Objects-normal/x86_64
    /libSingularity.LinkFileList" -install_name libSingularity.dylib -mmacosx-version-
    min=10.6 -framework sfml-system-d -framework sfml-window-d -framework SFML 
    -framework OpenGL -framework OpenAL -framework sfml-graphics-d -single_module 
    -compatibility_version 1 -current_version 1 -o "/Users/noahz/Desktop/Singularity
    /Singularity Engine/build/Debug/libSingularity.dylib"

, а вот команда компоновщика для тестового приложения:

cd "/Users/noahz/Desktop/Singularity/Singularity Test App"
setenv MACOSX_DEPLOYMENT_TARGET 10.6
/Developer/usr/bin/g++-4.2 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk 
    "-L/Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug" "-F/Users
    /noahz/Desktop/Singularity/Singularity Test App/build/Debug" -filelist "/Users/noahz
    /Desktop/Singularity/Singularity Test App/build/Singularity Test App.build/Debug
    /Singularity Test App.build/Objects-normal/x86_64/Singularity Test 
    App.LinkFileList" -mmacosx-version-min=10.6 "/Users/noahz/Desktop/Singularity
    /Singularity Engine/build/Debug/libSingularity.dylib" -o "/Users/noahz/Desktop
    /Singularity/Singularity Test App/build/Debug/Singularity Test App"

Любые идеи о том, почему это происходит и / или как это исправить

Ответы [ 3 ]

0 голосов
/ 29 июля 2010

Я не вижу строки в вашей стадии соединения

-lSingularity

, очевидно, еще один способ загрузки динамической библиотеки - это полная загрузка из кода.

gSystem->Load("libSingularity");

Я просто перефразирую найденную статью в блоге.

http://root.cern.ch/phpBB3//viewtopic.php?f=3&t=10380&start=0

0 голосов
/ 30 июля 2010

Я решил проблему, связав библиотеку статически.Это не так элегантно, как динамическое связывание, но, по крайней мере, оно не падает многократно.

0 голосов
/ 29 июля 2010

Если ваше приложение отличается архитектурой x86 / 64 от библиотеки, которую вы пытаетесь загрузить, это может объяснить вашу проблему.

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

...