c++ - ¿Construyendo bibliotecas estáticas en Mac usando CMake y GCC?
macos static-libraries (3)
Desafortunadamente, establecer -no_warning_for_no_symbols puede no ser suficiente. El comando ar en Mac ejecutará ranlib para usted, lo que hace que se muestre el mensaje "no tiene símbolos / usr / bin / ranlib". Puede detener este mensaje en la Mac utilizando las siguientes reglas de 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>")
La configuración ARCHIVE_CREATE "Scr" evitará que ar ejecute ranlib por usted. La configuración ARCHIVE_FINISH evitará que ranlib se queje de los símbolos faltantes.
Debe usar ambos conjuntos de reglas para marcar el mensaje "sin símbolos".
Una cosa más para los novatos de CMake: los comandos que CMake genera para los comandos ar y ranlib se vuelcan en un archivo link.txt. Si tiene problemas para generar archivos, puede consultar link.txt para ver lo que CMake está haciendo por usted.
Saludos a todos,
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: ¡compilé 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 fase de enlace, da los siguientes errores y crea 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 vinculo la biblioteca superior con mi aplicación, se producen errores de "símbolos no definidos":
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
Algun consejo ? ¿Debo agregar algún parámetro especial al construir bibliotecas estáticas en Mac?
EDIT: ¡compilé la biblioteca como una biblioteca COMPARTIDA y funcionó bien!
El problema similar con las bibliotecas estáticas en MacOSX se trata aquí: http://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html
Intenta hacer una limpieza completa y ejecutar una compilación no paralela.
Y esta guía recomienda instalar macports, luego "sudo port install autogen autoconf automake nano libtool libsdl patchutils subversion wget gmake", y luego exportar PATH = "/ usr / local / bin: / usr / local / sbin: $ PATH"
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 (prefijado 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 observar las quejas de ranlib
.
Ocasionalmente, si se queda sin espacio en el disco en un momento inconveniente, podría tener archivos de objetos 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.