Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    How to tell qmake copy third-party framework to DEST_DIR(.app/Contents/...) on OS X?

    General and Desktop
    os x qmake framework build directory
    2
    16
    4298
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      artemskikh last edited by

      Hello!
      I'm having a bit of a problem with CEF (Chromium Embedded Framework) in a cross-platform Qt project.
      I'm working on a Mac machine, and I'm linking to CEF framework and the c++ wrapper for CEF(cef_dll_wrapper). I've managed to compile the code, but I can't run it, I get:
      dyld: Library not loadhed: @executable_path/Chromium Embedded Framework
      Referenced from: (DEST_DIR)
      Reason: image not found

      Which basically tells me that I need to copy the framework into smth like .app/Contents/MacOS etc. (Although I haven't succeded in running my app by manually copying the framework there, any hints?)
      Is there a way to tell qmake to copy the framework into my DEST_DIR automatically?
      Any help would be greatly appreciated :)

      1 Reply Last reply Reply Quote 0
      • SGaist
        SGaist Lifetime Qt Champion last edited by

        Hi and welcome to devnet,

        Are you trying to deploy your app ? If so you have macdeployqt to help

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply Reply Quote 0
        • A
          artemskikh last edited by

          Hi, thanks )
          No, I'm not deploying yet (meaning I'm not trying to distribute it or anything, I might have a different understanding of what "deploying" means, English is not my first language).
          I'm trying to build and run my app on my machine, so far I've only managed to build it. But I get the above mentioned errors when I try to run it.
          In theory, I should add something to the pro file so that some other person on another machine can checkout my git branch, hit build and run and it would work.
          So I (presumably) have to tell qmake to copy the CEF framework into my DEST_DIR.
          But I can't even run it at this point.

          1 Reply Last reply Reply Quote 0
          • SGaist
            SGaist Lifetime Qt Champion last edited by

            That or modify the CEF framework with install_name_tool to make it more usable while developing.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply Reply Quote 0
            • A
              artemskikh last edited by

              Right. But that other person would then have to do the same thing, right?
              Also, I've found some tips about install_name_tool but I'm not sure how it works, or what it does, rather.

              1 Reply Last reply Reply Quote 0
              • SGaist
                SGaist Lifetime Qt Champion last edited by

                Yes

                install_name_tool, allows you to alter the paths of the dependencies of your application or library. That allows you to embed frameworks/libraries etc. in your bundle and make your application find them. e.g. @executable_path means that the dependency is found in the same folder as the executable.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply Reply Quote 0
                • A
                  artemskikh last edited by

                  Well, I kind of get it, but I can't get it to run even without playing with install_name_tool, so that's where my confusion comes from.
                  I built the app, and let's say it's in ../bin/myapp.app
                  the @executable_path is myapp.app/Contents/MacOS/
                  After getting that message on trying to run my app, I thought I'd just copy the CEF framework into the Contents/MacOS/ , and so I did.
                  But I still cannot run it with the same mistake. Is there any reason that could happen?
                  otool -L myapp gives:
                  @executable_path/Chromium Embedded Framework (compatibility version 31979.8.123, current version 31979.8.123)
                  otool -L Chromium\ Embedded\ Framework gives:
                  @executable_path/Chromium Embedded Framework (compatibility version 31979.8.123, current version 31979.8.123)

                  1 Reply Last reply Reply Quote 0
                  • A
                    artemskikh last edited by

                    Finally made it work by changing the path to C E F.framework/C E F (did not understand that I have to "go inside .framework" for a while) for myapp.app
                    Thanks for the help! )
                    Will try to figure out how to properly do it now.

                    1 Reply Last reply Reply Quote 0
                    • SGaist
                      SGaist Lifetime Qt Champion last edited by

                      Usually macdeployqt would do that for you. You can also write your own script that call install_name_tool

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply Reply Quote 0
                      • A
                        artemskikh last edited by SGaist

                        Yeap, ended up writing the script for this. Have another question if you don't mind:
                        The script currently runs when qmake runs (which is not good), I wanted to add it to QMAKE_POST_LINK, and it worked great when I only needed the path to script, but then I had to pass my script an argument so I ended up using the system() function of qmake.
                        And it didn't work well, was giving me errors, but worked fine when I removed the QMAKE_POST_LINK +=
                        Anyway, do you have an idea of why something like
                        QMAKE_POST_LINK += system($$PATH_TO_SCRIPT $$SCRIPTARG) wouldn't work and leaving only system($$PATH_TO_SCRIPT $$SCRIPTARG)does?

                        [edit: added coding tags around pro file code SGaist]

                        1 Reply Last reply Reply Quote 0
                        • SGaist
                          SGaist Lifetime Qt Champion last edited by

                          You should use two $ signs when you want to get the content of a variable

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply Reply Quote 0
                          • A
                            artemskikh last edited by

                            Yes, I was doing that, I think when I posted my message the other ones were cut off. So it should work this way? I don't know what might be the problem. $$

                            1 Reply Last reply Reply Quote 0
                            • SGaist
                              SGaist Lifetime Qt Champion last edited by

                              Ok, just remembered: QMAKE_POST_LINK should contain command(s) for the shell in a similar way you would write in a Makefile. So is your script executable ?

                              Interested in AI ? www.idiap.ch
                              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply Reply Quote 0
                              • A
                                artemskikh last edited by

                                Sorry, I'm not big on scripts and the terminology there, it's just a .sh script with a series of commands, like cd [folder] , install_name -change [bla-bla] etc.
                                To make it executable I should return some value at the end or ..?
                                The error I get is:
                                "/bin/sh: -c: line 0: syntax error near unexpected token `"path/to/script"'

                                I also tried QMAKE_POST_LINK += system(sh $$ARG1 $$ARG2) to no avail

                                1 Reply Last reply Reply Quote 0
                                • SGaist
                                  SGaist Lifetime Qt Champion last edited by

                                  chmod +x name_of_your_script to make it executable.

                                  QMAKE_POST_LINK += $$quote($$ARG1 $$ARG2) should do the trick

                                  Interested in AI ? www.idiap.ch
                                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  1 Reply Last reply Reply Quote 0
                                  • A
                                    artemskikh last edited by

                                    Thank you, turned out it could be done like this:
                                    QMAKE_POST_LINK += $SCRIPT_PATH $ARG1 $ARG2
                                    No need for system()

                                    1 Reply Last reply Reply Quote 0
                                    • First post
                                      Last post