2009-06-14 12 views
5

हमारे पास dbookpy.c नामक एक सी फ़ाइल है, जो कुछ सी कार्यों को बाध्यकारी पाइथन प्रदान करेगी।एक पायथन साझा करना, जिसमें सेमेक के साथ बाध्यकारी साझा किया गया है, जो बाहरी पुस्तकालयों पर निर्भर करता है

अगला हम cmake साथ एक उचित .so बनाने का निर्णय लिया है, लेकिन यह हम बंधन में बाहरी पुस्तकालय 'libdbook' जोड़ने के लिए कुछ संबंध है के साथ गलत कर रहे हैं लगता है:

CMakeLists.txt इस प्रकार है:

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 
) 

फिर हम निर्माण:

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 

अब तक तो अच्छा। पायथन में परीक्षण:

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. 
>>> 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 "<stdin>", line 1, in <module> 
ImportError: Cannot load specified object 

हमम। लिंकर त्रुटि। यह ऐसा लगता है libdbook लिंक नहीं है:

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 

नहीं ऐसा नहीं है। libdbook करने के लिए एक उचित लिंकेज इस तरह दिखता है:

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 

किसी को भी किसी भी विचार क्यों यह काम नहीं कर रहा है?

बहुत धन्यवाद।

Edd

उत्तर

3

आप dbook के खिलाफ dbookpy लिंक करने की आवश्यकता:

target_link_libraries(dbookpy dbook) 

जोड़ा जा रहा है कि बस लाइन ADD_LIBRARY(dbookpy dbookpy) के बाद यह करना चाहिए।

मैं आप आयात उपयोग कर रहे हैं - IMPORTED_LINK_INTERFACE_LIBRARIES के लिए मदद पढ़ता है:

Lists libraries whose interface is included when an IMPORTED library target is 
linked to another target. The libraries will be included on the link line for 
the target. Unlike the LINK_INTERFACE_LIBRARIES property, this property 
applies to all imported target types, including STATIC libraries. This 
property is ignored for non-imported targets. 

तो इसका मतलब है कि "dbook" है, जो/usr/स्थानीय/lib में है, किसी आयातित पुस्तकालय होना चाहिए:

add_library(dbook SHARED IMPORTED) 

क्या वाकई आप क्या चाहते थे? मेरा मतलब है, आयातित पुस्तकालय वे हैं जो सीएमके के बाहर बनाए जाते हैं लेकिन आपके स्रोत पेड़ के हिस्से के रूप में शामिल होते हैं। लगता है कि डबुक लाइब्रेरी स्थापित की जा रही है या कम से कम स्थापित होने की उम्मीद है। मुझे नहीं लगता कि आपको यहां आयात की जरूरत है - ऐसा लगता है कि यह एक नियमित जुड़ाव समस्या है। लेकिन यह यहां पोस्ट करने के लिए एक न्यूनतम उदाहरण बनाने का दुष्प्रभाव हो सकता है।

इसकी आवाज़ से, लिंक किए गए पुस्तकालयों और लिंक निर्देशिकाओं को हल करने के लिए, मैं शायद find_library() का उपयोग करूंगा, जो समझदार डिफ़ॉल्ट स्थानों जैसे/usr/local/lib में दिखाई देगा, और उसके बाद इसे संलग्न करें लिंक पुस्तकालयों।

find_library(DBOOK_LIBRARY dbook REQUIRED) 
target_link_libraries(dbookpy ${DBOOK_LIBRARY})  

वैसे भी, ऐसा लगता है जैसे आपने इसे हल किया है।

+0

हाय आरक्यू, नीचे दिए गए उत्तर को देखें। धन्यवाद –

1

आपकी मदद के लिए धन्यवाद।

आप कहने के लिए सही हैं कि आयातित की आवश्यकता नहीं है। LINK_LIBRARIES (डब्बी डबुक) जोड़ना वास्तव में जीसीसी निष्पादन में -बुक को जोड़ता है, इसलिए यह बहुत अच्छा है।

हालांकि cmake LINK_DIRECTORIES अनदेखी करने के लिए प्रकट होता है, और इसलिए कभी नहीं -ldbook पाता है:

/usr/bin/gcc -fPIC -shared -o libdbookpy.so.0.1 "CMakeFiles/dbookpy.dir/dbookpy.o" -ldbook 
/usr/bin/ld: cannot find -ldbook 

यहाँ CMakeList के रूप में यह खड़ा है:

PROJECT(dbookpy) 
SET(CMAKE_VERBOSE_MAKEFILE ON) 

OPTION(BUILD_SHARED_LIBS "turn OFF for .a libs" ON) 
ADD_LIBRARY(dbookpy dbookpy) 
SET_TARGET_PROPERTIES(dbookpy PROPERTIES LINKER_LANGUAGE C) 


FIND_PACKAGE(PythonInterp) 
FIND_PACKAGE(PythonLibs) 

INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) 
INCLUDE_DIRECTORIES(/usr/local/include) 
target_link_libraries(dbookpy dbook) 
LINK_DIRECTORIES("/usr/local/lib") 

SET_TARGET_PROPERTIES(dbookpy 
PROPERTIES 
     SOVERSION 0.1 
     VERSION 0.1 
) 

INSTALL(TARGETS dbookpy 
     LIBRARY DESTINATION lib 
) 

कोई भी विचार?

+1

उत्तर ADD_LIBRARY से पहले LINK_DIRECTORIES जोड़ने का उत्तर है :) –

+0

यह ध्यान देने योग्य है कि target_link_libraries परियोजना के नाम और lib के नाम की अपेक्षा करता है, lib के पथ नहीं (जो एक उदाहरण मैं उपयोग कर रहा था)। दूसरे शब्दों में, वह भाग जो -एल के आगे दिखाई देगा, यानी। डीबी (बर्कले डीबी के लिए) जो libdb है और -ldb के रूप में दिखाई देता है। – Asher