パスワードを忘れた? アカウント作成
451152 journal

Gonyの日記: GNU Autotools戦記。 2

日記 by Gony

ここまでのあらすじ、つーか備忘録(お

もともとはソースディレクトリ直下にソースファイルが
配置してあり、その状態では問題なくautoconf / automakeが
動いていた。で、今後の拡張に備え、機能毎にサブディレクトリ下に
ソースを移動したところ、automakeに「サブディレクトリには
対応してねえぜ畜生!!」とか怒られる。
畜生はこっちのセリフだぜ畜生!! とか思いつつも対策が思い付かず、
まとまった情報元の必要を感じ、御本購入。
で、御本からの入れ知恵によりサブディレクトリごとにMakefileを
作り、Libtoolライブラリとやらを作るという対策に挑む。
が、今度はautomake実行中に"library used but `LIBTOOL' not defined
in `configure.in'"ってエラーがでて、無視してもリンクで怒られる。
configure.inにはAC_PROG_LIBTOOLってちゃんと書いてるし、
もうわけわからん、のでLibtoolはあきらめて、普通のlibもご.aの
形式のライブラリをこしらえることにして問題回避。

これで終ったかと思ったら今度はソースディレクトリ直下にソースが
ないとプログラム名の.cファイルを勝手にコンパイルしようと
しだして有事。そんなファイルねえよ(苦笑)。
ソースディレクトリ直下のMakefile.amの

bin_PROGRAMS = もご
もご_LDADD = もご/libもご.a ... (以下略)

bin_PROGRAMS = もご
もご_SOURCES =
もご_LDADD = もご/libもご.a ... (以下略)

にしたら回避できた。なんじゃそりゃ。
と思ったら今度はリンクが通らない、つーかリンカ(gcc)のコマンド名が
端末にでてない。Makefileを見ると$(LINK)が設定されていない。
とりあえずあれだ、もういい加減やんだぐなった(仙台弁で)ので、
Makefile.amに

LINK = gcc -o もご

と追加して無理矢理逃げる。
なんかインチキにも程があるが、当分configure.inもMakefile.amも
いぢりたくないので、このままでいこうかと(お
もっと上品な解決法ご存知のかたいらっしゃいましたら
ツッコミおねがいいたします(ぺこり)。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • ああ、なるほど。たしかにautomakeはこういう構成をうまく扱えませんね。こういう場合には以下のようにダミーのソースファイルを一つ置いてやってください。

    bin_PROGRAMS = もご
    もご_SOURCES = dummy.c
    もご_LDADD = もご/libもご.a ...

    ついでに。作るものが共有ライブラリだとlibtoolも絡んでくるのでもっとややこしくなります。例えばlibfoo.soを作る場合、やり方は以下のようになります。


    Makefile.am:

    SUBDIRS = sub1 sub2 ...
    lib_LTLIBRARIES = libfoo.la
    libfoo_la_SOURCES = dummy.c
    libfoo_la_LIBADD = sub1/spam.lo sub1/egg.lo sub2/spam.lo ...

    sub1/Makefile.am:

    noinst_LTLIBRARIES = libsub1.la
    libsub1_la_SOURCES = spam.c egg.c


    まず、共有ライブラリを作る場合に_LIBADDに含めることができるのは.lo(libtool object)と.la(libtool library)だけです。.oや.aを直接リンクすることはできません。

    次に注意しなければならないのは、_LIBADDにlibsub1.laを入れてはいけないということです。さもないと、libfoo.soにはlibsub1.soが必要だけど見つからないよ、ということになってしまうので。sub1でlibsub1.laを作っているのは.loを作るためです。
    • またまたアドバイスくださりありがとうございます。

      ダミーのソースファイルを置くという対処法は思い付きませんでした。
      この対処法でリンクが通らない問題が解決したことはもちろん、
      これに味をしめ、調子にのってトップディレクトリのMakefile.amに

      lib_LTLIBRARIES = libdummy.la
      libdummy_la_SOURCES = dummy.c

      と追加したところLibtoolが動かなかった問題も解決しました。
      ほんとはダミーなんて使わなくともちゃんとGNU Autotoolsのほうで
      対応してくれれば一番いいんですけど、ぼくは手段は割とどうでもいい
      人なので(まて)、Autotoolsが対応してくれるまではこの手で
      対処しようと思います。

      もいちど、ありがとうございます。
      --
      ごにい(ろぐいんするのなんかげつぶりだろう)
      親コメント
typodupeerror

UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア

読み込み中...