[CMake] UseSWIG creates module instead of shared library, which can't be dynamically loaded
Clinton Stimpson
clinton at elemtech.com
Thu Aug 6 10:23:56 EDT 2009
On 08/06/2009 06:49 AM, Mathieu Malaterre wrote:
> 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.
>
And for python on Windows, I've had to do
set_target_properties(... PROPERTIES SUFFIX ".pyd")
or the module doesn't work with some versions of python.
Clint
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20090806/5d867336/attachment.htm>
More information about the CMake
mailing list