ページ 11

g++によるライブラリリンク

Posted: 2010年12月25日(土) 23:31
by ぬっち
お世話になっています。

最近WindowsからLinuxへ開発環境を変えることが多くなってきたのでMakefileを導入しました。
そして、そのMakefile内でスタティックライブラリを作成することを行った後、その作成したスタティックライブラリを使用して実行可能ファイルを作ることにしました。
その実行可能ファイルを作るコマンドとして、
g++ -o [オブジェクトファイル] [スタティックライブラリファイル]
としました。
しかし、なぜかundefined reference...(スタティックライブラリファイルに入っているメソッドなど)というエラーが出てきてしまいます。

そこで、スタティックライブラリを作成するMakefileで、
ar rv [ライブラリファイル] ["複数の"オブジェクトファイル]
から
ar rv [ライブラリファイル] ["1つの"オブジェクトファイル]
に変更したところ問題なく実行ファイルが作成されました。

スタティックライブラリの作成に失敗しているのかと思いar tvで複数のオブジェクトファイルの中身を見てみると、きちんと指定したオブジェクトファイルが入っていることがわかりました。

他にもいろいろ試してみたのですが、期待した動作をしません。
コマンドの指定の仕方が間違っているのでしょうか?

よろしくお願いします。

Re: g++によるライブラリリンク

Posted: 2010年12月26日(日) 00:04
by ISLe
gcc(g++)ではライブラリを-lオプションで指定します。
-lfoo
とオプションを記述すると
libfoo.a
というライブラリファイルが検索対象になります。

Re: g++によるライブラリリンク

Posted: 2010年12月26日(日) 00:21
by ぬっち
ISLe さんが書きました:libfoo.a
というライブラリファイルが検索対象になります。
そうするとライブラリファイルは全てlibで始まり、拡張子をaとしなければいけないということでしょうか?

今回私が使っていたライブラリ名は、「Xlib.lib」というファイル名にしてありまして、このようなものをライブラリファイルとして使用することは出来ないということでしょうか?

Re: g++によるライブラリリンク

Posted: 2010年12月26日(日) 00:42
by ISLe
ぬっち さんが書きました:そうするとライブラリファイルは全てlibで始まり、拡張子をaとしなければいけないということでしょうか?
そういう仕様みたいですね。
リンカ(ld)を単独で呼び出すときもライブラリ指定オプションは同様なので、最低でもリンカを改造しないと自由に名前を付けるのは無理そうです。

【追記】
arで固めたらファイル名の最後に.aを付けるというだけで、UNIX文化には拡張子という考え方は無く.aがライブラリということにはなりません。
VC(MS-C)のlibで固めたファイルには.libが付き、拡張子libはライブラリとして扱うという文化の違いです。

Re: g++によるライブラリリンク

Posted: 2010年12月26日(日) 01:03
by ぬっち
なるほど・・・いろいろ参考になります^^

それで早速Xlib.libからlibXlib.aに変更して、再びリンクをやってみると、やはりundefined reference toというエラーが出てきてしまいますね。
ちなみに、スタティックライブラリは別のフォルダにあるんですけど、これが問題なのかな・・・。
うーん、なんでだろう・・・。

Re: g++によるライブラリリンク

Posted: 2010年12月26日(日) 01:13
by ぬっち
どうやら自己解決できたようです。
Makefile内でパターンルールを使用していたのですが、1つのオブジェクトファイルに対して、複数のソースファイルが関連付けられていたようです。
どうして気がつかなかったのだろう(^^;)

それでもしかしたらと思い、Xlib.libでリンクを行った結果・・・できました!
g++ -o [オブジェクトファイル] [スタティックライブラリファイル]
において、スタティックライブラリファイルのフルパスを指定すれば期待した結果を得ることが可能でした。

すべてはパターンルールの記述が問題であったことを考えると、なんとも申し訳ないです。

Re: g++によるライブラリリンク

Posted: 2010年12月26日(日) 02:37
by ISLe
ぬっち さんが書きました:g++ -o [オブジェクトファイル] [スタティックライブラリファイル]
において、スタティックライブラリファイルのフルパスを指定すれば期待した結果を得ることが可能でした。
すみません。こちらも勘違いしていました。
-lはライブラリパスからライブラリファイル(-lXXX→libXXX.a)を検索するオプションですね。
gcc(g++)のコマンドラインにソースファイルと同じ並びでオブジェクトファイルやライブラリファイルを指定してちゃんと実行ファイルが作成されるのを確認しました。

Re: g++によるライブラリリンク

Posted: 2010年12月26日(日) 02:45
by ぬっち
解決のチェックを入れるのを忘れていました。
ISLeさんいろいろとありがとうございました。