2011-02-08 12 views
12

ग्रीटिंग्स,सीएमके और जीसीसी का उपयोग कर मैक पर स्थिर पुस्तकालयों का निर्माण?

मेरे पास एक स्थिर लाइब्रेरी है जिसे बाद में मैंने अपने आवेदन से लिंक किया। मेरा विकास पर्यावरण सीएमके, जीसीसी (लिनक्स, मैक), मिनजीडब्लू (विंडोज) है।

मैं लिनक्स और विंडोज पर किसी भी समस्या के बिना स्थैतिक पुस्तकालय संकलित कर सकता हूं। (मैक पर अपने आवेदन में साझा पुस्तकालय भी बना सकता हूं)।

संपादित करें: मैंने पुस्तकालय को साझा पुस्तकालय के रूप में संकलित किया और यह ठीक काम किया !!

मैं CMakeFile कॉन्फ़िगर किया है के रूप में स्थिर पुस्तकालय का निर्माण इस प्रकार है:

add_library(centi STATIC ${base_srcs} ${crv_srcs} ${node_srcs} ${trnk_srcs} ${defl_srcs} ${infl_srcs} ${track_srcs} ${callback_srcs} ${extract_srcs}) 

चरण जोड़ने के दौरान, यह निम्न त्रुटियों देता है और "libcenti.a" किसी भी तरह का निर्माण।

Linking C static library 
lib/libcenti.a /usr/bin/ranlib: file: 
lib/libcenti.a(crv_in_rgn_to_bnry_img.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_initialize_by_circle.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_initialize_flgs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_nodal_interval_min_and_max.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_remove_all_nodes.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_reset_nodal_forces.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_center_coords.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_left_ptch_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_out_rgn_mean_and_var.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_para.c.o) has 
no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_right_ptch_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_to_in_rgn_hist.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_to_out_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_initialize_by_circle.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_initialize_by_image_frame.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_stk_paint_nodes_and_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_stk_to_inner_defl_ordn.c.o) 
has no symbols 

लेकिन जब मैं अपने आवेदन के साथ पुस्तकालय ऊपर लिंक, यह "अपरिभाषित प्रतीकों" त्रुटियों देता है:

Undefined symbols: 
"_setActiveDrawingTrunk", referenced 
from: 
     RzPluginAlgoCnty::initCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::clearCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _extract_contour_update_tracking in 
libcenti.a(extract_contour_update_tracking.c.o) 
     _extract_contour_update_tracking in 
libcenti.a(extract_contour_update_tracking.c.o) 
"_updateCurveUICallBack", referenced 
from: 
     RzPluginAlgoCnty::initCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::initBulkCallBacks() 
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::clearCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _crv_update_1time in libcenti.a(crv_update_ordn.c.o) 
     _crv_update_1time in libcenti.a(crv_update_ordn.c.o) ld: 
symbol(s) not found 

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

संपादित करें: मैंने पुस्तकालय को साझा पुस्तकालय के रूप में संकलित किया और यह ठीक काम किया !!

+0

साझा साझा लाइब्रेरी के रूप में संकलित करके इसे भी ठीक किया गया। –

+0

* "लिंकिंग चरण के दौरान, यह निम्नलिखित त्रुटियों को देता है और किसी भी तरह" libcenti.a "बनाता है .... कोई प्रतीक नहीं है" * - वे त्रुटियां नहीं हैं; वे [बेकार] चेतावनियां हैं। आपको संभवतः ओएस एक्स पर 'libtool' और' ar' और 'ranlib'' का उपयोग नहीं करना चाहिए। मैंने सोचा कि इसे दबाने का विकल्प था, लेकिन मुझे इस समय यह नहीं मिल रहा है। यह भी देखें [सामग्री की मौन "तालिका खाली है" चेतावनी] (https://stackoverflow.com/q/27602998/608639)। – jww

उत्तर

6

MacOSX पर स्थिर पुस्तकालयों के साथ इसी तरह की समस्या यहाँ पर चर्चा की है: एक पूर्ण स्वच्छ करते हैं और एक नहीं के समानांतर निर्माण को चलाने के लिए http://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html

प्रयास करें।

और this guide, फिर "sudo बंदरगाह स्थापित autogen autoconf automake नैनो libtool libsdl patchutils तोड़फोड़ wget gmake", और फिर निर्यात पथ = "/ usr/स्थानीय/बिन macports स्थापित करने के लिए सिफारिश की गई है:/usr/स्थानीय/sbin: $ पथ "

+1

समस्याएं हो सकती हैं क्योंकि मैक 'ar' गैर मानक है। – osgx

+2

@umanga, क्या आपने अपनी समस्या का समाधान किया? कैसे? – osgx

7

ranlib से चेतावनियां इंगित करती हैं कि उन ऑब्जेक्ट फ़ाइलों में कोई परिचालन कोड नहीं था। यह देखने के लिए कि प्रत्येक कोड में मैक पर संकलित किया जाना चाहिए, आपको प्रत्येक संबंधित स्रोत फ़ाइल की समीक्षा करने की आवश्यकता है। यह हो सकता है कि कोड कहीं और पोर्ट किया गया था लेकिन सशर्त संकलन मैक को सही ढंग से पहचान नहीं करता है।

यह 'स्लैम डंक' निदान नहीं है; गायब प्रतीकों स्पष्ट रूप से दो समूहों में हैं - trnk से संबंधित हैं और crv से संबंधित हैं - और फाइलें दो समूहों में भी हैं (prefixed trnk और crv), लेकिन यह हो सकता है कि फ़ाइलें विभिन्न कार्यों को परिभाषित करें। इसलिए, मैं खाली ऑब्जेक्ट फ़ाइलों से संबंधित स्रोत फ़ाइलों को देखकर देखूंगा और देख सकता हूं कि आप लापता कार्यों को देख सकते हैं (शायद रिपोर्ट किए गए लापता प्रतीक नामों पर अग्रणी अंडरस्कोर को अनदेखा करें)। यदि उन कार्यों को उन फ़ाइलों में परिभाषित किया गया है, तो आपको ranlib से शिकायतों को देखना होगा।

कभी-कभी, यदि आप एक असुविधाजनक पल में डिस्क स्थान से बाहर निकलते हैं, तो आपके पास शून्य आकार वाली ऑब्जेक्ट फ़ाइलें हो सकती हैं (जिनमें कोई प्रतीक नहीं है)। उस स्थिति में, बस खाली ऑब्जेक्ट फ़ाइलों को हटाएं (और कुछ जगह खाली करें, लेकिन आपको पहले से ही यह करना होगा) और फिर से निर्माण करें।

+0

उत्तर के लिए धन्यवाद। –

+1

क्या इन ऑब्जेक्ट फ़ाइलों को अनदेखा करने के लिए रैनलिब को बताने का कोई तरीका है जिसमें कोई परिचालन कोड नहीं है? मेरे पास कुछ ऑब्जेक्ट्स फ़ाइल हैं क्योंकि वे अन्य प्लेटफॉर्म के लिए थे (उदाहरण के लिए ओएसएक्स के लिए संकलन करते समय केवल विंडोज़ कार्यान्वयन)। मैं अपने सेमेक में अन्य प्लेटफ़ॉर्म के कार्यान्वयन को रखना चाहता हूं क्योंकि मैं अपने आईडीई में फ़ाइल देखने में सक्षम होना चाहता हूं (मैं QtCreator का उपयोग करता हूं) ताकि मैं उन्हें संपादित कर सकूं। दुर्भाग्यवश, QtCreator सोचता है कि वे त्रुटियां हैं। – mchiasson

+3

कभी नहीं, मुझे लगता है कि मुझे यह मिला। "-no_warning_for_no_symbols" – mchiasson

8

दुर्भाग्य से, -no_warning_for_no_symbols सेट करना पर्याप्त नहीं हो सकता है।मैक पर ar कमांड आपके लिए रनलिब चलाएगा, जिसके कारण "कोई प्रतीक/usr/bin/ranlib" संदेश प्रदर्शित नहीं होता है। आप नीचे दिए गए CMake नियमों का उपयोग करके मैक पर इस संदेश को बंद कर सकते हैं:

SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 
SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 
SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 

ARCHIVE_CREATE "स्क्रिप्ट" सेटिंग आपके लिए ranlib चलने से arरखेंगे। ARCHIVE_FINISH सेटिंग अनुपलब्ध प्रतीकों के बारे में शिकायत करने से ranlib को गग करेगा।

आपको नियमों के दोनों सेटों का उपयोग करने के लिए "कोई प्रतीकों" संदेश को गड़बड़ करने की आवश्यकता नहीं है। CMake नवागंतुकों के लिए

एक और बात: आदेश CMake ar और ranlib आदेशों एक link.txt फ़ाइल में फेंक दिया जाता है के लिए उत्पन्न करता है। यदि आपको अभिलेखागार उत्पन्न करने में समस्याएं आ रही हैं, तो आप यह देखने के लिए link.txt पर देखना चाहेंगे कि सीएमके आपके लिए क्या कर रहा है।

संबंधित मुद्दे