title: Building a Python shared object binding with cmake, which depends upon external libraries
body: <p>We have a c file called dbookpy.c, which will provide a Python binding some C functions.</p>
  
  <p>Next we decided to build a proper .so with cmake, but it seems we are doing something wrong with regards to linking the external library 'libdbook' in the binding:</p>
  
  <p>The CMakeLists.txt is as follows:</p>
  
  <pre><code>PROJECT(dbookpy)
  
  FIND_PACKAGE(PythonInterp)
  FIND_PACKAGE(PythonLibs)
  
  INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
  INCLUDE_DIRECTORIES("/usr/local/include")
  LINK_DIRECTORIES(/usr/local/lib)
  OPTION(BUILD_SHARED_LIBS "turn OFF for .a libs" ON)
  
  ADD_LIBRARY(dbookpy dbookpy)
  SET_TARGET_PROPERTIES(dbookpy PROPERTIES  IMPORTED_LINK_INTERFACE_LIBRARIES dbook)
  SET_TARGET_PROPERTIES(dbookpy PROPERTIES LINKER_LANGUAGE C)
  #SET_TARGET_PROPERTIES(dbookpy PROPERTIES LINK_INTERFACE_LIBRARIES dbook)
  #SET_TARGET_PROPERTIES(dbookpy PROPERTIES ENABLE_EXPORTS ON)
  #TARGET_LINK_LIBRARIES(dbookpy LINK_INTERFACE_LIBRARIES dbook)
  
  SET_TARGET_PROPERTIES(dbookpy
  PROPERTIES
      SOVERSION 0.1
      VERSION 0.1
  )
  </code></pre>
  
  <p>Then we build:</p>
  
  <pre><code>x31% mkdir build
  x31% cd build 
  x31% cmake ..
  -- Check for working C compiler: /usr/bin/gcc
  -- Check for working C compiler: /usr/bin/gcc -- works
  -- Check size of void*
  -- Check size of void* - done
  -- Check for working CXX compiler: /usr/bin/c++
  -- Check for working CXX compiler: /usr/bin/c++ -- works
  -- Configuring done
  -- Generating done
  -- Build files have been written to: /home/edd/dbook2/dbookpy/build
  x31% make
  Scanning dependencies of target dbookpy
  [100%] Building C object CMakeFiles/dbookpy.dir/dbookpy.o
  Linking C shared library libdbookpy.so
  [100%] Built target dbookpy
  </code></pre>
  
  <p>So far so good. Test in Python:</p>
  
  <pre><code>x31% python
  Python 2.5.4 (r254:67916, Apr 24 2009, 15:28:40) 
  [GCC 3.3.5 (propolice)] on openbsd4
  Type "help", "copyright", "credits" or "license" for more information.
  &gt;&gt;&gt; import libdbookpy
  python:./libdbookpy.so: undefined symbol 'dbook_isbn_13_to_10'
  python:./libdbookpy.so: undefined symbol 'dbook_isbn_10_to_13'
  python:./libdbookpy.so: undefined symbol 'dbook_sanitize'
  python:./libdbookpy.so: undefined symbol 'dbook_check_isbn'
  python:./libdbookpy.so: undefined symbol 'dbook_get_isbn_details'
  Traceback (most recent call last):
    File "&lt;stdin&gt;", line 1, in &lt;module&gt;
  ImportError: Cannot load specified object
  </code></pre>
  
  <p>Hmmm. Linker error. Looks like it is not linking libdbook:</p>
  
  <pre><code>x31% ldd libdbookpy.so
  libdbookpy.so:
          Start    End      Type Open Ref GrpRef Name
      05ae8000 25aec000 dlib 1    0   0      /home/edd/dbook2/dbookpy/build/libdbookpy.so.0.1
  </code></pre>
  
  <p>No it is not. A proper linkage to libdbook looks like this:</p>
  
  <pre><code>x31% ldd /usr/local/bin/dbook-test 
  /usr/local/bin/dbook-test:
      Start    End      Type Open Ref GrpRef Name
      1c000000 3c004000 exe  1    0   0      /usr/local/bin/dbook-test
      08567000 28571000 rlib 0    2   0      /usr/lib/libm.so.5.0
      09ef7000 29efb000 rlib 0    1   0      /usr/local/lib/libdbook.so.0.1
      053a0000 253d8000 rlib 0    1   0      /usr/lib/libc.so.50.1
      0c2bc000 0c2bc000 rtld 0    1   0      /usr/libexec/ld.so
  </code></pre>
  
  <p>Does anyone have any ideas why this is not working?</p>
  
  <p>Many thanks.</p>
  
  <p>Edd</p>