[CMake] SWIG_ADD_MODULE and other files on mingw

Kris Thielemans kris at asc.uk.com
Mon Oct 29 00:16:37 EDT 2012


Hi

I'm using cmake to call swig to generate my a python interface to my C++
library. I crafted the following CMakeLists.txt from the FAQ:

FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})
FIND_PACKAGE(PythonLibs)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
SET_SOURCE_FILES_PROPERTIES(stir.i PROPERTIES CPLUSPLUS ON)
SWIG_ADD_MODULE(stir python stir.i ${STIR_REGISTRIES})
SWIG_LINK_LIBRARIES(stir ${STIR_LIBRARIES} ${PYTHON_LIBRARIES})
	
Here the variables STIR_REGISTRIES and STIR_LIBRARIES are set elsewhere. The
"registries" are .cxx files that initialise some global variables
(initialising some registries). These .cxx files need to compiled and then
passed explicitly to the linker.

The above works just fine on Ubuntu. However, now I'm also trying to build
on Windows using mingw (with shared libraries "ON"). Unfortunately, in this
case the "registries" are ignored for the linking step. For example, the
link.txt file that cmake generates looks like

"C:\Program Files (x86)\CMake 2.8\bin\cmake.exe" -E remove -f
CMakeFiles\_stir.dir/objects.a
C:\MinGW32-xy\bin\ar.exe cr CMakeFiles\_stir.dir/objects.a
@CMakeFiles\_stir.dir\objects1.rsp
C:\MinGW32-xy\bin\g++.exe     -shared -o _stir.pyd
-Wl,--major-image-version,0,--minor-image-version,0 -Wl,--whole-archive
CMakeFiles\_stir.dir/objects.a -Wl,--no-whole-archive
..\buildblock\libbuildblock.dll.a C:\Python27\libs\libpython27.a -lkernel32
-luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32
-ladvapi32

While on ubuntu it looks like

/usr/bin/c++  -fPIC -DSTIR_USE_BOOST_SPTR -g  -shared -Wl,-soname,_stir.so
-o _stir.so CMakeFiles/_stir.dir/stirPYTHON_wrap.cxx.o
CMakeFiles/_stir.dir/__/buildblock/buildblock_registries.cxx.o
../buildblock/libbuildblock.so -Wl,-rpath,<ETC>

You can see that there's no explicit mention of
buildblock_registries.cxx.obj or so in the mingw version. In fact, it is
listed in the objects1.rsp file, so it will be added to the library, but not
passed to the linker. This doesn't work in my case (see end of email).

Any suggestions? I'm using CMake 2.8.5 on Windows 7, mingw 4.5.2.2.

Thanks

Kris

PS: the reason I need to pass these registry files to the linker is that
they contain global variables (whose initialisation has some side effects).
These global variables are nowhere referenced in the code, and so the linker
doesn't import them from the objects.a library.



More information about the CMake mailing list