Library not found on Mac OS



  • Hello everyone,

    I'm facing a new problem with my project and I have trouble to solve it.

    I have an application that runs on Windows, and I have successfully compile it for Mac OS. The application starts but it catches me an exception "file not found: RecomputeDimBlock.tx".
    This exception is launched from an ODA function (ODA is an external lib used for this project).
    After some research I found that this function search the library into myapp.app/Contents/MacOS.

    I placed the library into this folder but it still doesn't detect it...
    I have try to follow these steps on this thread : https://forum.qt.io/topic/59209/solved-osx-deployment-fatal-error-with-dylib-library-not-loaded-image-not-found/4 but it still not find the lib.

    And then I have try with the command macdeploy and I have got this error :
    Error: no file at "/isr/lib/libMdCore.1.dylib"
    Error: no file at "/isr/lib/libMdWidget.1.dylib"
    Error: no file at "/isr/lib/libMdModels.1.dylib"

    that is normal because those lib are in my debug folder, why does he looking for those lib here ?

    Thanks in advance for your help !


  • Lifetime Qt Champion

    Hi,

    Call otool -L on these libraries to get the shared lib informations.



  • Here is the output

    RecomputeDimBlock.tx:
    	@loaderpath/RecomputeDimBlock.tx (compatibility version 0.0.0, current version 0.0.0)
    	/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
    	/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1404.0.0)
    	libTD_Db.dylib (compatibility version 0.0.0, current version 0.0.0)
    	libTD_DbRoot.dylib (compatibility version 0.0.0, current version 0.0.0)
    	libTD_Gi.dylib (compatibility version 0.0.0, current version 0.0.0)
    	libTD_SpatialIndex.dylib (compatibility version 0.0.0, current version 0.0.0)
    	libTD_Ge.dylib (compatibility version 0.0.0, current version 0.0.0)
    	libsisl.dylib (compatibility version 0.0.0, current version 0.0.0)
    	libTD_Root.dylib (compatibility version 0.0.0, current version 0.0.0)
    	libTD_Alloc.dylib (compatibility version 0.0.0, current version 0.0.0)
    	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
    	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)
    

    I have checked, every lib listed are well placed except libSystem.B.dylib, which I cannot find on the Mac.


  • Lifetime Qt Champion

    What version of Qt are you using ?

    How did you call macdeployqt ? Also where did you call if from ?

    What version of OS X are you using ?



  • I use Qt 5.7. I called macdeploy like that :

    /Users/developpement/Qt/5.7/clang_64/bin/macdeployqt MediaCad.app
    

    and I the output is :

    ERROR: no file at "/usr/lib/libMdCore.1.dylib"
    ERROR: no file at "/usr/lib/libMdWidgets.1.dylib"
    ERROR: no file at "/usr/lib/libMdModels.1.dylib"
    

    I call it from my .app directory.

    I have tried to call it with -verbose=3 and here is the output : http://textup.fr/172668xw

    I'm using OS X 10.11.5


  • Lifetime Qt Champion

    Ok try with:

    Add

    QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/
    

    to your libraries .pro file

    and

    QMAKE_RPATHDIR += /path_your_libs_dir/
    

    to your application .pro file



  • So, I tried that but I still got the same error with macdeploy and the same exception in my app. Maybe I did it wrong :
    I add QMAKE_FLAGS_SONAME = -Wl, -install_name, @rpath/
    and in my app .pro : DEPENDPATH += ../debug

    I have tried to change the first one into QMAKE_FLAGS_SONAME = -Wl, -install_name, ../debug/ but still the same thing.

    The exception is about RecomputeDimBlock.tx, which is not a lib from me, so I can't apply anything to it


  • Lifetime Qt Champion

    Why DEPENDPATH ? It's not the same thing as QMAKE_RPATHDIR.

    Also, I'd rather try with the full path using the OUT_PWD variable with QMAKE_RPATHDIR



  • I just copy/paste the wrong line, I have tested with QMAKE_DIRPATH.
    It didn't change with OUT_PWD.
    Maybe there is a thing to do with command install_name_tool on all library ? I will take a look on this trail


  • Lifetime Qt Champion

    Again, it's not QMAKE_DIRPATH, it's QMAKE_RPATHDIR



  • erf... I should go back to school and learn to read again !
    so now I have : QMAKE_RPATHDIR=OUT_PWD/../debug
    but, nothing has changed


  • Lifetime Qt Champion

    Did you forgot the double $ before OUT_PWD?



  • Oh... Yes... It explains why it didn't work !
    The command macdeploy now works fine ! A lot a thing appeared in the .app. But the .tx is still not detected even after copying it on the right directory


  • Lifetime Qt Champion

    Can you remind me what these .tx files are ?



  • In my case .tx is a lib provided by ODA library.
    When my app start, I use a function "loadapp" from ODA, to load my .tx. After debugging it seams that this function is looking for the tx into <myapp.app>/Contents/MacOS directory, so I placed my lib here but it still doesn't detect it


  • Lifetime Qt Champion

    macdeployqt won't handle them because it currently only targets .framework and .dylib.

    If we want to nitpick, putting "plugin" in the MacOS folder is wrong from a bundle point of view.

    You have to write a script that copies these .tx file at the right place and call install_name_tool on them to update the paths to all their dependencies (excluding the system libraries)



  • ok so if I understood correctly, I have to write a script that first build my .app, then copy the .tx into MacOS and finally apply install_name_tool ?


  • Lifetime Qt Champion

    Not necessarily. I was more thinking about a post-macdeployqt script that would handle the .tx files.



  • ok, given that I'm an intern and my internship will end next week, I prefer writing a bash script that makes everything, that will be easier for my workmate in the future.
    Is there anyway to tell Qt that it has to call this script after compiling ?


  • Lifetime Qt Champion

    What do you mean by everything ? Run macdeployqt or build your application + macdeployqt + .tx deployment ?



  • Yes, after compiling, the script calls macdeployqt, and install every tx properly, the application should work after that (I hope).
    For the moment I just call macdeployqt and copy every tx into MacOS.


  • Lifetime Qt Champion

    It's been a long time since I've done this but IIRC you should be able to do that adding a custom target.

    See qmake's adding custom targets documentation.



  • Thanks for your help ! I will take a look a that, and post another thread if I have a lot of problems.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.