Создание статических библиотек на Mac с использованием CMake и GCC? - PullRequest
12 голосов
/ 08 февраля 2011

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

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

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

РЕДАКТИРОВАТЬ: я скомпилировал библиотеку как библиотеку 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".Приведенная выше библиотека с моим приложением выдает ошибки «Неопределенные символы»:

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?

РЕДАКТИРОВАТЬ: я скомпилировал библиотеку как библиотеку SHARED, и она работала нормально !!

Ответы [ 3 ]

8 голосов
/ 11 октября 2015

К сожалению, установки -no_warning_for_no_symbols может быть недостаточно. Команда ar на Mac запустит для вас ranlib , в результате чего будет отображено сообщение «нет символов / 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 заставит ranlib жаловаться на отсутствующие символы.

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

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

8 голосов
/ 10 февраля 2011

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

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

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

6 голосов
/ 16 февраля 2011

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

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

И это руководство рекомендует установить macports, затем "sudo port установить autogen autoconf automake nano libtool libsdl patchutils subversion wget gmake", а затем экспортировать PATH = "/ usr / local / bin: / usr / local / sbin: $ PATH"

...