[Solved]dyld: Library not loaded --- for a custom widget
-
Dear Qt experts:
I compiled a custom widget in a .dylib (libdline45vplugin.dylib) and installed it in ~/QtSDK/Desktop/Qt/473/gcc/plugins/designer. Then I created a simple project with only one such widget in the ui. I added the following two lines in .pro to get the project compiled in addition to copy dline45v.h to the project directory:
LIBS += -ldline45vplugin
LIBS += -L/Users/stu/qt/CW_DL45v-build-desktopHowever I got the following runtime error:
dyld: Library not loaded: libdline45vplugin.dylib
Referenced from: /Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t
Reason: image not foundAny one can tell me where should I put the dylib to get the project running? Manually or there is a tool for this purpose?
Thanks.
-
You can tray to add the path to your lib to DYLD_LIBRARY_PATH, see an example in "this reply":http://developer.qt.nokia.com/forums/viewreply/19939/ of another thread.
Additionally, what path for your lib is shown on this command:
@
otool -L /Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t
@ -
Hi Volker,
The "otool" utility shows that the libdline45vplugin.dylib does not have absolute/complete path.
$ otool -L /Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t
/Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t:
libdline45vplugin.dylib (compatibility version 0.0.0, current version 0.0.0)I added the DYLD_LIBRARY_PATH in .profile. After re-refrence it, I got the env output:
$ env |grep DY
DYLD_LIBRARY_PATH=/Users/stu/qt/CW_DL45v-build-desktopHowever, I still get the same error. Did I miss any step?
Thanks.
-
Maybe the dylib is missing some other libs, check it with otool too.
You need not install it to plugins/designer. As long as it is not a designer plugin, it's useless in that place.
If it is a designer plugin, then you shouldn't use that dylib for your actual program.
-
Hi Volker,
a little bit history for my project.
I want to create some custom widgets which will be used in the form layout in the Creator. I followed the online instruction, create a widget, compiled it in a dylib, and "make install" installed it in ~/QtSDK/Desktop/Qt/473/gcc/plugins/designer. However, when starting the Creator, I could not see my widget. If I manually copy the dylib to "Qt Creator.app/Contents/PlugIns/designer", the Creator crashes at startup. With the advise from other developer, I downloaded the source code of the Qt Creator, compiled it, and put it in QtSDK directory. then I can use my widget in the Creator.
Please let me know if I was wrong in any steps in creating the custom widget.Now I want to test my widget to build an application, and result in this "image not found" error.
this is the complete output of otool:
$ otool -L /Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t
/Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t:
libdline45vplugin.dylib (compatibility version 0.0.0, current version 0.0.0)
/Users/stu/QtSDK/Desktop/Qt/473/gcc/lib/QtGui.framework/Versions/Current/QtGui (compatibility version 4.7.0, current version 4.7.3)
/Users/stu/QtSDK/Desktop/Qt/473/gcc/lib/QtCore.framework/Versions/Current/QtCore (compatibility version 4.7.0, current version 4.7.3)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 625.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10)Thanks.
-
another question, for the app, should I compile the lib in different way from the .dylib used in designer?
thanks.
-
Now I compiled a C++ shared library libdl45v.1.0.0.dylib with the same widget source code. modified .pro as
LIBS += -ldl45v
LIBS += -L/Users/stu/qt/dl45v-build-desktopThe compilation is clean. But the runtime error is still there. This time it looks for different dylib:
dyld: Library not loaded: libdl45v.1.dylib
Referenced from: /Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t
Reason: image not foundmy otool output:
$ !736
otool -L /Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t
/Users/stu/qt/t-build-desktop/t.app/Contents/MacOS/t:
libdl45v.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/stu/QtSDK/Desktop/Qt/473/gcc/lib/QtGui.framework/Versions/Current/QtGui (compatibility version 4.7.0, current version 4.7.3)
/Users/stu/QtSDK/Desktop/Qt/473/gcc/lib/QtCore.framework/Versions/Current/QtCore (compatibility version 4.7.0, current version 4.7.3)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 625.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10)$ env |grep DY
DYLD_LIBRARY_PATH=/Users/stu/qt/dl45v-build-desktopand I have these files in dl45v-build-desktop:
Makefile
libdl45v.1.0.dylib
moc_dline45v.cpp
dline45v.o
libdl45v.1.dylib
moc_dline45v.o
libdl45v.1.0.0.dylib
libdl45v.dylibThanks.
-
If you run this from within Qt Creator, then you must add the DYLD_LIBRARY_PATH environment variable to the execution environment (project pane/run settings). It is not pulled in from the shell!
-
Hi Volker,
Thanks for the help. I added the path in the Projects pane. IT WORKS.
I will mark this thread as SOLVED shortly after the next questions cleared.
I want to clarify these steps:
- In my case the custom widget for Designer was right and the dylib (libdline45vplugin.dylib) was correctly installed.
- Why do I need to rebuild the Creator from source to use the custom widget?
- I need to build a shared library for the widget to be used in app, libdl45v.1.dylib. The shared lib should be created with the same source code of the widget (exclude the widgetInterface class).
If I did right for the above steps, where, by default, should I put the shared lib ?
Thanks.
-
Regarding Creator, I don't know. You'd better start a new thread in the "Tools Forum":http://developer.qt.nokia.com/forums/viewforum/13/.
Regarding the two libs:
You can link the designer plugin to the shard lib with the widgets. You must add that lib to designer/creator too. I don't know where it has to go, though.Or create a static version of your widget lib and link that to the plugin. You end up with only the plugin shared lib then, no additional libs to install. That's what I do here.
The place for the shared lib(s) is platform dependent. Please have a look in the docs for that (deployment) resp. refer to the system specifications of your OS.