2011-02-08 14 views
12

Saluti tutti,Costruire librerie statiche su Mac usando CMake e GCC?

Ho una libreria statica che successivamente collegherò alla mia applicazione. Il mio ambiente di sviluppo è CMake, GCC (Linux, Mac), MinGW (Windows).

posso compilare la libreria statica senza alcun problema su Linux e Windows. (Posso persino creare librerie condivise nella mia applicazione su Mac).

EDIT: Ho compilato la libreria come libreria condivisa ed ha funzionato benissimo !!

Ho configurato CMakeFile come segue per costruire la libreria statica:

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

Durante la fase di collegamento, dà i seguenti errori e crea il "libcenti.a" in qualche modo.

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 

Ma quando ho link qui sopra biblioteca con la mia domanda, dà "simboli non definiti" errori:

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 

Qualche consiglio? Devo aggiungere qualche parametro speciale quando costruisci librerie statiche su Mac?

MODIFICA: Ho compilato la libreria come libreria CONDIVISA e ha funzionato correttamente !!

+0

Inoltre risolto questo problema compilando come libreria condivisa. –

+0

* "Durante la fase di collegamento, dà i seguenti errori e costruisce il" libcenti.a "in qualche modo .... non ha simboli" * - Questi non sono errori; sono avvertimenti [inutili]. Probabilmente dovresti usare 'libtool' e non' ar' e 'ranlib' su OS X. Pensavo ci fosse un'opzione per sopprimerlo, ma non riesco a trovarlo al momento. Vedi anche il sommario [Silence "è vuoto" avviso] (https://stackoverflow.com/q/27602998/608639). – jww

risposta

6

Il problema simile con le librerie statiche su MacOSX è discusso qui: http://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html

cercare di fare una pulizia completa ed eseguire una build non-parallelo.

E this guide raccomanda di installare macports, poi "sudo port install autogen autoconf automake nano libtool libsdl patchutils sovversione wget gmake", e quindi export PATH = "/ usr/local/bin:/usr/local/sbin: $ PATH "

+1

i problemi possono essere come Mac 'ar' non standard. – osgx

+2

@umanga, hai risolto il tuo problema? Come? – osgx

7

Le avvertenze da ranlib indicano che tali file oggetto non contenevano codice operativo. È necessario rivedere ogni file sorgente corrispondente per vedere se il codice che contiene deve essere compilato su Mac. È possibile che il codice sia stato portato altrove, ma la compilazione condizionale non riconosce correttamente il Mac.

Non è una diagnosi 'slam dunk'; i simboli mancanti sono chiaramente in due gruppi - quelle relative alla trnk e quelli relativi alla crv - ei file sono anche in due gruppi (prefissato trnk e crv), ma potrebbe essere che i file definiscono funzioni diverse. Quindi, vorrei andare a guardare i file di origine corrispondenti ai file oggetto vuoti e vedere se è possibile vedere le funzioni mancanti (probabilmente ignorare il trattino di sottolineatura principale sui nomi dei simboli mancanti segnalati). Se tali funzioni sono definite in tali file, è necessario esaminare i reclami da ranlib.

Occasionalmente, se si esaurisce lo spazio su disco in un momento inopportuno, è possibile avere file di oggetti a dimensione zero (che quindi non contengono simboli, quindi). In tal caso, è sufficiente rimuovere i file oggetto vuoti (e liberare spazio, ma è già necessario farlo) e ricostruire.

+0

grazie per la risposta. –

+1

C'è un modo per dire a ranlib di ignorare questi file oggetto che non contengono codice operativo? Ho alcuni file di oggetti come questo perché erano pensati per altre piattaforme (ad esempio, l'implementazione solo per Windows durante la compilazione per OSX). Voglio mantenere l'implementazione dell'altra piattaforma nel mio cmake perché voglio poter vedere il file nel mio IDE (io uso QtCreator) in modo da poterli modificare. Sfortunatamente, QtCreator pensa che siano errori. – mchiasson

+3

Nevermind, penso di averlo trovato. "-no_warning_for_no_symbols" – mchiasson

8

Purtroppo, l'impostazione -no_warning_for_no_symbols potrebbe non essere sufficiente.Il comando ar sul Mac eseguirà ranlib per te, il che causerà la visualizzazione del messaggio "non ha simboli/usr/bin/ranlib". Ci si può fermare questo messaggio su Mac utilizzando le seguenti regole 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>") 

L'ARCHIVE_CREATE impostazione "Scr" manterrà ar esecuzione ranlib per voi. L'impostazione ARCHIVE_FINISH gag ranlib da lamentarsi di simboli mancanti.

È necessario utilizzare entrambi i gruppi di regole per il messaggio "nessun simbolo".

Una cosa di più per i neofiti CMake: I comandi CMake genera per il ar e ranlib comandi vengono scaricati in un file link.txt. Se hai problemi con la generazione di archivi, potresti voler dare un'occhiata a link.txt per vedere cosa sta facendo CMake per te.

Problemi correlati