2011-02-08 8 views
12

グリーティングすべて、CMakeとGCCを使ってMacでスタティックライブラリをビルドする?

私は後で自分のアプリケーションにリンクする静的ライブラリを持っています。私の開発環境は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」を構築します。

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 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ライブラリとしてコンパイルして正常に動作しました。

+0

共有ライブラリとしてコンパイルすることでこれを修正しました。 –

+0

* "リンクフェーズでは、次のエラーが発生し、libcenti.aを構築しています。何らかの形でシンボルがありません。* - これらはエラーではありません。彼らは[役に立たない]警告です。 OS Xで 'art'と' ranlib'ではなく 'libtool'を使っているはずです。私はそれを抑制するオプションがあると思っていましたが、現時点ではそれを見つけることはできません。 [Silence "目次は空です"警告(https://stackoverflow.com/q/27602998/608639)も参照してください。 – jww

答えて

6

のMacOSX上の静的ライブラリと同様の問題は、ここで議論されている:フルクリーンを行い、並列ではないビルドを実行するためのhttp://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html

てみてください。

そしてthis guideはMacPortsのをインストールすることを推奨し、その後、 "sudoのポートのAUTOGENのautoconf automakeはnanoをインストールしたlibtool libsdl patchutils転覆wgetコマンドはgmake"、および= "は/ usr/local/binにエクスポート・PATH:は/ usr/local/sbinにします。$ PATH "

+1

は、Macの 'ar'が標準ではないため、問題になる可能性があります。 – osgx

+2

@umanga、あなたはあなたの問題を解決しましたか?どうやって? – osgx

7

ranlibの警告は、これらのオブジェクトファイルに操作コードが含まれていないことを示しています。対応する各ソースファイルを確認して、含まれているコードをMacでコンパイルする必要があるかどうかを確認する必要があります。コードが他の場所に移植されている可能性がありますが、条件付きコンパイルでMacが正しく認識されないことがあります。

「スラムダンク」診断ではありません。不足しているシンボルは明らかに2つのグループ、すなわちtrnkに関連し、crvに関連するグループであり、同様に2つのグループ(接頭語はtrnkおよびcrv)であるが、ファイルが異なる機能を定義している可能性がある。だから、私は空のオブジェクトファイルに対応するソースファイルを見て、欠けている機能を見ることができるかどうかを見てみましょう(おそらく、報告されていないシンボル名の先頭のアンダースコアを無視します)。それらの機能がこれらのファイルに定義されている場合は、ranlibから苦情を参照する必要があります。

不都合なときにディスク領域を使い果たした場合、ゼロサイズのオブジェクトファイル(シンボルが含まれていない)があることがあります。その場合は、単に空のオブジェクトファイルを削除して(空き領域を解放しますが、すでに完了している必要があります)、再度ビルドしてください。

+0

答えに感謝します。 –

+1

操作コードを含まないこれらのオブジェクトファイルをranlibが無視するように指示する方法はありますか?私は他のプラットフォーム(OSXのためにコンパイルする際にはWindowsのみの実装など)用であるため、このようなオブジェクトファイルをいくつか持っています。他のプラットフォームの実装を私のcmakeに保存したいのは、自分のIDE(私はQtCreatorを使用しています)のファイルを編集できるように見たいからです。残念ながら、QtCreatorはエラーであると考えています。 – mchiasson

+3

気にしない、私はそれを見つけたと思う。 "-no_warning_for_no_symbols" – mchiasson

8

残念ながら、-no_warning_for_no_symbolsを設定すると、十分でない場合があります。Macでarコマンドを実行するとranlibが表示され、「/ usr/bin/ranlibには記号がありません」というメッセージが表示されます。あなたは、次のcmakeの規則を使用してMac上でこのメッセージを停止することができます:

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を」設定はあなたのためRANLIBを実行しているからARを維持します。 ARCHIVE_FINISHの設定では、ranlibはシンボルの欠落を訴えません。

"シンボルなし"メッセージを表示するには、両方のルールセットを使用する必要があります。

CMakeの初心者のためのもう一つ:cmakeのはコマンドがlink.txt・ファイルにダンプされているARRANLIBのために生成するコマンド。アーカイブの生成に問題がある場合は、link.txtを見て、CMakeが何をしているのか見てみてください。

関連する問題