Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Building static libraries on Mac using CMake and GCC?

Greetings all,

I have a static library which I later link with my application. My development environment is CMake, GCC (Linux, Mac), MinGW (Windows).

I can compile the static library without any problem on Linux and Windows. (I can even build shared libraries in my application on Mac).

EDIT: I compiled the library as a SHARED library and it worked fine!!

I have configured CMakeFile as follows to build the static library:

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

During linking phase, it gives following errors and build the "libcenti.a" somehow.

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

But when I link above library with my application, it gives "Undefined symbols" errors:

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

Any tips ? Should I add any special parameters when building static libraries on Mac?

EDIT: I compiled the library as a SHARED library and it worked fine!!

like image 508
Ashika Umanga Umagiliya Avatar asked Feb 08 '11 03:02

Ashika Umanga Umagiliya


1 Answers

Unfortunately, setting -no_warning_for_no_symbols may not be enough. The ar command on the Mac will run ranlib for you, which causes the "has no symbols /usr/bin/ranlib" message to be displayed. You can stop this message on the Mac by using the following CMake rules:

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

The ARCHIVE_CREATE "Scr" setting will keep ar from running ranlib for you. The ARCHIVE_FINISH setting will gag ranlib from complaining about missing symbols.

You need to use both sets of rules to gag "no symbols" message.

One more thing for CMake newbies: The commands CMake generates for the ar and ranlib commands are dumped into a link.txt file. If you're having problems generating archives, you may want to look at link.txt to see what CMake is doing for you.

like image 131
russes Avatar answered Oct 11 '22 18:10

russes