[CMake] UseSWIG creates module instead of shared library, which can't be dynamically loaded
Mathieu Malaterre
mathieu.malaterre at gmail.com
Thu Aug 6 08:49:12 EDT 2009
On Thu, Aug 6, 2009 at 2:46 PM, Mathieu
Malaterre<mathieu.malaterre at gmail.com> wrote:
> On Thu, Aug 6, 2009 at 2:27 PM, Stephen Roderick<kiwi.net at mac.com> wrote:
>> On Aug 6, 2009, at 06:02 , Mathieu Malaterre wrote:
>>
>>> On Wed, Aug 5, 2009 at 6:55 PM, Stephen Roderick<kiwi.net at mac.com> wrote:
>>>>
>>>> The existing UseSWIG.cmake file creates a MODULE and not a SHARED
>>>> library.
>>>> The module is unuseable by any program trying to load dynamic libraries
>>>> (eg
>>>> wrapped Java). The attached patch fixes this problem for our situations.
>>>> Demonstrated on both Mac OS X Leopard and Ubuntu Jaunty.
>>>>
>>>> Is this a known issue? I searched what I could of the list and the 'net,
>>>> and
>>>> couldn't find anything on this.
>>>
>>> No, you are confusing the C++ library and the Java binding. Instead:
>>>
>>> ADD_LIBRARY(foo SHARED ${foo_SRCS}) # the actual shared lib
>>> SWIG_ADD_MODULE(foojni java foo.i)
>>> SWIG_LINK_LIBRARIES(foojni foo
>>> ${JNI_LIBRARIES}
>>> )
>>>
>>> The next time you will want to create -say- a python module you'll
>>> simply link to your *shared C++* library:
>>>
>>> SWIG_ADD_MODULE(foopython python foo.i)
>>> SWIG_LINK_LIBRARIES(foopython foo
>>> ${PYTHON_LIBRARIES}
>>> )
>>
>> Unfortunately, that is what we currently have.
>>
>> <code>
>> ADD_LIBRARY(MyInterfaceCpp ...)
>>
>> Find_Package(SWIG REQUIRED)
>> Find_Package(JNI REQUIRED)
>> INCLUDE(UseSWIG)
>> INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
>>
>> SET_SOURCE_FILES_PROPERTIES(MyInterface.i PROPERTIES CPLUSPLUS 1)
>> # compile swig with package flag
>> SET(CMAKE_SWIG_FLAGS -package x.y.z)
>>
>> SWIG_ADD_MODULE(MyInterface java MyInterface.i)
>> SWIG_LINK_LIBRARIES(MyInterface
>> MyInterfaceCpp ...)
>> </code>
>>
>> The failure comes when you try to load the SWIG-output, JNI library from
>> within java, using something like
>> <code>
>> static {
>> System.loadLibrary("MyInterface");
>> }
>> </code>
>>
>> With a module in a "MyInterface.so" file (what SWIG currently outputs), the
>
> No. On Linux 'lib' is always preprended, even for MODULE. I am not
> sure about MacOSX.
>
>> above call fails on both Mac OS X and Linux. They both need a correctly
>> named dynamic library, hence the patch.
>
> I have been using this in gdcm and it works fine on Linux:
>
> http://gdcm.svn.sf.net/viewvc/gdcm/trunk/Wrapping/Java/gdcm.i?r1=5779&r2=5799
My bad... I forgot that SWIG stuff always override the 'lib' setting,
hence you have to revert it:
http://gdcm.svn.sf.net/viewvc/gdcm/trunk/Wrapping/Java/CMakeLists.txt?view=markup
See comments:
...
IF(UNIX)
SET_TARGET_PROPERTIES(${SWIG_MODULE_gdcmjni_REAL_NAME} PROPERTIES
PREFIX "lib")
ENDIF(UNIX)
...
I think this comes from the SWIG module initially designed based on
the python requirement where '_' would be preprended before the actual
lib name.
Sorry for the confusion.
--
Mathieu
http://mathieumalaterre.com
More information about the CMake
mailing list