2016-10-12 2 views
0

私はthis questionとよく似た問題があります。私はそのシンボルを参照するために作られているようだが、静的なlibを追加するようにリンカーに指示する必要がある。 その理由は、ライブラリが順番に、その機能を登録するには、メインプログラムからレジスタ()関数を呼び出すために起こっているその初期化を実行するために.initまたは使用(__attribute__ ((constructor)))内の関数が含まれていることです(読み:他の合格関数ポインタ)。後者は、ライブラリの初期化関数を経て登録されているよう autools、libtool、-Wl、-whole-archive

だから、ライブラリからのシンボルがメインプログラムで使用しているように思わないという事実にもかかわらず、メインプログラムは、すぐにライブラリから関数を呼び出します。 「

bin_PROGRAMS = pktanon 
pktanon_SOURCES = main.cpp 
pktanon_DEPENDENCIES = $(lib_LIBRARIES) 
pktanon_LDADD = libpktanon.la $(LDADD) 

注「ラ」の拡張子の代わり:

しかし、私は だから以前mentionned質問に与えられた例を取って... libtoolを使用しています、私は次のように書く必要があると思います"libのために。

は今、どのように私は、リンカに--whole-archiveオプションに合格しなければなりませんか? the questionで提案されている答えは、それはMakefile.am ... にハードコードに.LIBS/libptanon.aようなパスを右感じていない...知られているアーカイブ(.aファイル)へのパスを想定し、リンカはありません

pktanon_LDFLAGS = -Wl,--whole-archive,libpktanon.la,--no-whole-archive 

任意の提案:しようとした場合にその全アーカイブotpionで.laファイルを満たして好きではありませんか?

答えて

0

--whole-archiveの使用は移植性がありません。代わりにLibtoolコンビニエンスライブラリを作成してみてはいかがですか?あなたのAutomake Makefile.amで、noinst_をライブラリに追加し、静的ではないアーカイブを作成するのではなく、ライブラリ内のすべてのオブジェクトファイルを取り出し、それをリンクするものに追加します。これは移植性があり、この場合はライブラリがほしいとは思わないので、この場合にはうまくいくはずです。

+0

問題は私のLIBはむしろ反対より、メインプログラムからのシンボルを使用することである:autotoolsのコンビニエンスLIBS LがメインプログラムPにより参照シンボルを定義することを前提としていますautotoolsのはこのために、リンカーにP及びLを通過します。 --whole-archive(または--start-group)オプションがなければ、リンカーはLとPを "クロスリンク"しません。 私の場合、LはPからのシンボルを参照します。PはLによって参照されるシンボルを定義します。 autotools仮定の反対です。 この男に同じ問題がありました: http://lists.gnu.org/archive/html/automake/2006-03/msg00042.html ポイントII(モチベーション)セクション3を参照してください。 – user1159290

+0

円形ではないようにデザインを修正するか、単に "ライブラリ"をオブジェクトファイルのコレクションとして扱い、アーカイブに入れないでください。このようなデザインは、たとえばWindowsに移植することはできません。 –

関連する問題