2011-02-08 34 views
12

Saludos a todos,¿Construyendo bibliotecas estáticas en Mac usando CMake y GCC?

Tengo una biblioteca estática que luego vincularé con mi aplicación. Mi entorno de desarrollo es CMake, GCC (Linux, Mac), MinGW (Windows).

Puedo compilar la biblioteca estática sin ningún problema en Linux y Windows. (Incluso puedo crear bibliotecas compartidas en mi aplicación en Mac).

EDIT: ¡Recopilé la biblioteca como una biblioteca COMPARTIDA y funcionó bien!

He configurado CMakeFile de la siguiente manera para construir la biblioteca estática:

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

Durante la vinculación de fase, se da siguientes errores y construir el "libcenti.a" de alguna manera.

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 

Pero cuando enlace anterior biblioteca con mi solicitud, da símbolos "indefinido" Errores:

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 

Algún consejo? ¿Debo agregar algún parámetro especial al construir bibliotecas estáticas en Mac?

EDIT: He compilado la biblioteca como una biblioteca COMPARTIDA y funcionó bien !!

+0

También solucionó esto compilando como una biblioteca compartida. –

+0

* "Durante la fase de enlace, da los siguientes errores y crea el" libcenti.a "de alguna manera .... no tiene símbolos" * - Esos no son errores; son advertencias [inútiles]. Probablemente deberías estar usando 'libtool' y no' ar' y 'ranlib' en OS X. Pensé que había una opción para suprimirlo, pero no puedo encontrarlo en este momento. Consulte también [Advertencia: "la tabla de contenido está vacía", advertencia] (https://stackoverflow.com/q/27602998/608639). – jww

Respuesta

6

El problema similar con las bibliotecas estáticas en MacOSX se discute aquí: http://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html

tratar de hacer una limpieza completa y ejecutar una construcción no-paralelo.

Y this guide recomienda instalar macports, a continuación, "sudo port install autogen autoconf automake nano libtool libsdl patchutils subversión wget gmake", y luego export PATH = "/ usr/local/bin:/usr/local/sbin: $ PATH "

+1

puede ser un problema ya que Mac 'ar' no es estándar. – osgx

+2

@umanga, ¿resolvió su problema? ¿cómo? – osgx

7

Las advertencias de ranlib indican que esos archivos de objeto no contenían ningún código operativo. Debe revisar cada archivo fuente correspondiente para ver si el código que contiene debe compilarse en Mac. Es posible que el código haya sido portado a otra parte, pero la compilación condicional no reconoce Mac correctamente.

No es un diagnóstico de "golpe de gracia"; los símbolos faltantes están claramente en dos grupos: los relacionados con trnk y los relacionados con crv, y los archivos también están en dos grupos (con los prefijos trnk y crv), pero podría ser que los archivos definan funciones diferentes. Por lo tanto, iría a buscar los archivos fuente correspondientes a los archivos de objetos vacíos y veré si puede ver las funciones que faltan (probablemente ignore el guión bajo inicial de los nombres de símbolos que faltan informados). Si esas funciones están definidas en esos archivos, entonces debe ver las quejas en ranlib.

Ocasionalmente, si se quedó sin espacio en el disco en un momento inconveniente, podría tener archivos de objeto de tamaño cero (que no contienen símbolos, por lo tanto). En ese caso, simplemente elimine los archivos de objeto vacíos (y libere espacio, pero ya debe haberlo hecho) y vuelva a compilar.

+0

gracias por la respuesta. –

+1

¿Hay alguna manera de decirle a ranlib que ignore estos archivos de objeto que no contienen ningún código operativo? Tengo algunos archivos de objetos como este porque estaban destinados a otras plataformas (por ejemplo, la implementación solo de Windows al compilar para OSX). Quiero mantener la implementación de la otra plataforma en mi cmake porque quiero poder ver el archivo en mi IDE (uso QtCreator) para poder editarlos. Desafortunadamente, QtCreator cree que son errores. – mchiasson

+3

No importa, creo que lo encontré. "-no_warning_for_no_symbols" – mchiasson

8

Desafortunadamente, la configuración -no_warning_for_no_symbols puede no ser suficiente.El comando ar en Mac ejecutará ranlib para que aparezca el mensaje "no tiene símbolos/usr/bin/ranlib". Puede detener este mensaje en el Mac mediante el uso de las siguientes reglas CRealice:

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>") 

entorno El ARCHIVE_CREATE "Scr" mantendrá ar se ejecute ranlib para usted. La configuración ARCHIVE_FINISH calzará ranlib para quejarse de los símbolos que faltan.

Debe usar ambos conjuntos de reglas para marcar el mensaje "sin símbolos".

Una cosa más para los novatos CRealice: Los comandos CMake genera para el ar y ranlib comandos se vierten en un archivo link.txt. Si tiene problemas para generar archivos, puede consultar link.txt para ver lo que CMake está haciendo por usted.

Cuestiones relacionadas