2011-02-08 8 views
12

Pozdrawiam wszystkich,Budowanie bibliotek statycznych na komputerze Mac przy użyciu CMake i GCC?

Mam statyczną bibliotekę, którą później łączę z moją aplikacją. Moje środowisko programistyczne to CMake, GCC (Linux, Mac), MinGW (Windows).

Mogę skompilować bibliotekę statyczną bez problemu w systemach Linux i Windows. (Mogę nawet budować wspólne biblioteki w mojej aplikacji na Macu).

EDYCJA: skompilowałem bibliotekę jako bibliotekę SHARED i działało dobrze !!

mam skonfigurowane CMakeFile następująco zbudować bibliotekę statyczną:

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

Podczas łączenie fazy, daje następujące błędy i zbudować „libcenti.a” jakoś.

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 

Ale kiedy odwołuje powyżej biblioteki z mojej aplikacji, daje "niezdefiniowanych symboli" Błędy:

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 

jakieś wskazówki? Czy powinienem dodać jakieś specjalne parametry podczas budowania bibliotek statycznych na Macu?

EDYCJA: Skompilowałem bibliotekę jako bibliotekę SHARED i wszystko działało dobrze !!

+0

Naprawiono to również kompilując jako bibliotekę współużytkowaną. –

+0

* "Podczas fazy łączenia podaje następujące błędy i buduje" libcenti.a "jakoś .... nie ma symboli" * - To nie są błędy; są to [bezużyteczne] ostrzeżenia. Powinieneś prawdopodobnie używać 'libtool', a nie' ar' i 'ranlib' na OS X. Myślałem, że istnieje opcja, aby to powstrzymać, ale nie mogę go znaleźć w tej chwili. Zobacz także "Spisek" spis treści jest pusty "ostrzeżenie" (https://stackoverflow.com/q/27602998/608639). – jww

Odpowiedz

6

Podobny problem z statycznych bibliotek na MacOSX jest omawiany tutaj: http://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html

spróbować zrobić pełny czyste i uruchomić nie równolegle budować.

I this guide zaleca zainstalować MacPorts, następnie "port sudo zainstalować autogenny autoconf automake nano libtool libSDL patchutils Subversion wget gmake", a następnie export PATH = "/ usr/local/bin:/usr/local/sbin: $ PATH "

+1

może być problem, ponieważ Mac 'ar' jest niestandardowy. – osgx

+2

@umanga, czy rozwiązałeś swój problem? w jaki sposób? – osgx

7

Ostrzeżenia z ranlib wskazują, że te pliki obiektów nie zawierały kodu operacyjnego. Należy przejrzeć każdy odpowiadający plik źródłowy, aby sprawdzić, czy kod, który zawiera, powinien zostać skompilowany na komputerze Mac. Możliwe, że kod został przeniesiony gdzie indziej, ale kompilacja warunkowa nie rozpoznaje poprawnie Maca.

To nie jest diagnoza "wsadowa"; brakujące symbole są wyraźnie w dwóch grupach - tych związanych z trnk i tych związanych z crv - a pliki są również w dwóch grupach (prefiksami trnk i crv), ale może się zdarzyć, że pliki definiują różne funkcje. Tak więc chciałbym przejrzeć pliki źródłowe odpowiadające pustym plikom obiektów i sprawdzić, czy widać brakujące funkcje (prawdopodobnie zignorować wiodący podkreślnik w zgłoszonych brakujących nazwach symboli). Jeśli te funkcje są zdefiniowane w tych plikach, musisz spojrzeć na skargi z ranlib.

Czasami, jeśli zabrakło miejsca na dysku w niewygodnej chwili, można mieć pliki obiektów o zerowym rozmiarze (które nie zawierają symboli). W takim przypadku po prostu usuń puste pliki obiektów (i zwolnij trochę miejsca, ale musisz już to zrobić) i zbuduj ponownie.

+0

dziękuję za odpowiedź. –

+1

Czy istnieje sposób, aby ranlib zignorować te pliki obiektów, które nie zawierają kodu operacyjnego? Mam kilka plików tego typu, ponieważ były przeznaczone dla innych platform (np. Implementacja tylko Windows podczas kompilacji dla OSX). Chcę zachować implementację innej platformy w moim cmake, ponieważ chcę móc zobaczyć plik w moim IDE (używam QtCreator), aby móc je edytować. Niestety, QtCreator uważa, że ​​są to błędy. – mchiasson

+3

Nieważne, myślę, że znalazłem. "-no_warning_for_no_symbols" – mchiasson

8

Niestety ustawienie -no_warning_for_no_symbols może nie wystarczyć.Komenda ar na komputerze Mac uruchomi dla ciebie ranlib, co spowoduje wyświetlenie komunikatu "nie ma symboli/usr/bin/ranlib". Można zatrzymać tę wiadomość na komputerze Mac za pomocą następujących zasad CUpewnij:

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” ustawienie będzie trzymać ar z systemem ranlib dla Ciebie. Ustawienie ARCHIVE_FINISH spowoduje, że ranlib będzie skarżył się na brakujące symbole.

Musisz użyć obu zestawów reguł, aby zgasić wiadomość "brak symboli".

Jeszcze jedno dla początkujących CUpewnij: Polecenia CUpewnij generuje dla ar i ranlib polecenia są wrzucano do pliku link.txt. Jeśli masz problemy z generowaniem archiwów, możesz zajrzeć do pliku link.txt, aby zobaczyć, co robi dla ciebie CMake.

Powiązane problemy