Context:
I’m embedding a Python interpreter in a C++ application. The embedding relies on some code generated with SWIG. The library generated by SWIG needs to be linked into the C++ executable. I’ve set OUTPUT_DIR
option of swig_add_library
to tell CMake’s SWIG module where the library needs to be placed in the build so that it can be loaded from the SWIG generated .py file. It needs to be in the same directory as the SWIG generated Python files which in my case is not the lib directory.
Problem:
the SWIG generated library is linked into executables using “@rpath/_libname.so”, and the executable crashes because the SWIG OUTPUT_DIR is not in the RPATH (verified with otool -l).
dyld[75999]: Library not loaded: @rpath/_libname.so
I think I need to add the OUTPUT_DIR
used with swig_add_library
into the executable’s RPATH, and I should be able to do that with BUILD_RPATH target property and set CMAKE_SKIP_BUILD_RPATH OFF. However, the BUILD_RPATH property is being ignored the first “cmake && make” (verified with otool -l). However, It is picked up in the second “cmake && make”. For instance, eg I can touch CMakeCache.txt && make
and my BUILD_RPATH shows up in the executable.
cmake version 3.22.3
Any help on getting this working?
The main issue is that BUILD_RPATH is only picked up if “cmake && make” 2 times. Why would that happen?