Подтвердить что ты не робот

Создание статических библиотек на Mac с помощью CMake и GCC?

Приветствуем всех,

У меня есть статическая библиотека, которую я позже свяжу с моим приложением. Моя среда разработки - CMake, GCC (Linux, Mac), MinGW (Windows).

Я могу скомпилировать статическую библиотеку без каких-либо проблем в Linux и Windows. (Я даже могу создавать общие библиотеки в своем приложении на Mac).

EDIT: я скомпилировал библиотеку как библиотеку SHARED, и она отлично работала.

Я создал 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 символов:

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

Какие-нибудь советы? Должен ли я добавлять какие-либо специальные параметры при создании статических библиотек на Mac?

EDIT: Я скомпилировал библиотеку как библиотеку SHARED, и она отлично работала.

4b9b3361

Ответ 1

Аналогичная проблема со статическими библиотеками на MacOSX обсуждается здесь: http://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html

Попробуйте выполнить полную очистку и выполните непараллельную сборку.

И данное руководство рекомендует устанавливать macports, затем "sudo port install autogen autoconf automake nano libtool libsdl patchutils subversion wget gmake", а затем экспортировать PATH = "/USR/локальные/бен:/USR/локальные/SBIN: $PATH"

Ответ 2

К сожалению, установка -no_warning_for_no_symbols может быть недостаточной. Команда ar на Mac запускает runlib для вас, что приводит к отображению сообщения "no symbols/usr/bin/ranlib". Вы можете остановить это сообщение на Mac, используя следующие правила 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 "Scr" будет держать ar от запуска ranlib для вас. Параметр ARCHIVE_FINISH будет gag ranlib жаловаться на отсутствующие символы.

Вам нужно использовать оба набора правил для сообщения "без символов".

Еще одна вещь для новичков CMake: команды CMake, созданные для команд ar и ranlib, сбрасываются в файл link.txt. Если у вас возникли проблемы с созданием архивов, вы можете посмотреть на link.txt, чтобы узнать, что делает CMake для вас.

Ответ 3

Предупреждения от ranlib указывают, что в этих объектных файлах нет кода работы. Вам необходимо просмотреть каждый соответствующий исходный файл, чтобы узнать, должен ли скомпилированный код компилироваться на Mac. Возможно, код был перенесен в другое место, но условная компиляция не распознает Mac правильно.

Это не диагноз "slam dunk"; недостающие символы явно находятся в двух группах: те, которые относятся к trnk и относятся к crv - и файлы также находятся в двух группах (префикс trnk и crv), но может быть, что файлы определяют различные функции. Таким образом, я бы посмотрел исходные файлы, соответствующие пустым объектным файлам, и посмотрел, можно ли увидеть недостающие функции (возможно, игнорировать лидирующие подчеркивания в сообщениях о потерянных именах символов). Если эти функции определены в этих файлах, вы должны посмотреть жалобы от ranlib.

Иногда, если в неудобный момент вы исчерпали дисковое пространство, вы можете иметь объектные файлы нулевого размера (которые не содержат символов, поэтому). В этом случае просто удалите пустые файлы объектов (и освободите некоторое пространство, но вы уже должны это сделать) и снова создайте.