[PyQt] Wrong install name in dynamic libraries

Colin McPhail colin.mcphail at mac.com
Thu Feb 6 19:44:06 GMT 2014


Platform - PyQt5.2 Qt5.2 Python 3.3.3 Mac OS X 10.9.1

The Mac OS X dynamic libraries installed in the site-packages directory by
the PyQt5 build system have incorrect install names recorded in them. For
example QtCore.so has an install name of 'libQtCore.dylib', as shown by
   otool -D QtCore.so

The reason for this is that each library is created as libQtxxx.dylib, copied
to Qtxxx.so and then copied to .../site-packages/PyQt5/Qtxxx.so.  The initial
link command doesn't specify an install name and so the terminal name of the
output library ('libQtxxx.dylib') is used by default.

This doesn't cause a problem in normal use of PyQt5.  However, a recent post
by David Cortesi indicated that attempts to freeze an application for
distribution using cx_freeze failed because cx_freeze could not locate
libQtxxx.dylib files.  Off-list I suggested that David manually correct the
install names in his site-packages/PyQt5 direcory (using install_name_tool
-id commands) and he has indicated that the cx_freeze process was then able to
complete.

Below are two patches, for PyQt-gpl-5.2/configure.py and
QScintilla-gpl-2.8/Python/configure.py respectively, that set each dynamic
library's install name to the full path of the library after installation.

                  PyQt-gpl-5.2/configure.py
*** configure_orig.py	2014-02-04 15:43:08.000000000 +0000
--- configure.py	2014-02-06 12:54:52.000000000 +0000
***************
*** 2234,2239 ****
--- 2234,2240 ----
  }
  macx {
      QMAKE_LFLAGS += "-undefined dynamic_lookup"
+     QMAKE_LFLAGS += "-install_name $$absolute_path($$PY_MODULE, $$target.path)"
  }
  '''
  
                  QScintilla-gpl-2.8/Python/configure.py
*** configure_orig.py	2014-02-05 22:43:08.000000000 +0000
--- configure.py	2014-02-06 17:26:55.000000000 +0000
***************
*** 747,752 ****
--- 747,753 ----
  
  macx {
      QMAKE_LFLAGS += "-undefined dynamic_lookup"
+     QMAKE_LFLAGS += "-install_name $$absolute_path($$PY_MODULE, $$target.path)"
      QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\\\n\\\\t)$$quote(install_name_tool -change libqscintilla2.%s.dylib %s/libqscintilla2.%s.dylib $$PY_MODULE)
  }
  ''' % (QSCI_API_MAJOR, target_config.qsci_lib_dir, QSCI_API_MAJOR))

I have rerun a PyQt5 and QScintilla installation and have confirmed visually
that the expected install names are now present in the dynamic libraries
installed into site-packages. 

-- Colin McPhail



More information about the PyQt mailing list