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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

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

#1

投稿記事 by ぬっち » 13年前

お世話になっています。

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

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

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

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

よろしくお願いします。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#2

投稿記事 by ISLe » 13年前

gcc(g++)ではライブラリを-lオプションで指定します。
-lfoo
とオプションを記述すると
libfoo.a
というライブラリファイルが検索対象になります。

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

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

#3

投稿記事 by ぬっち » 13年前

ISLe さんが書きました:libfoo.a
というライブラリファイルが検索対象になります。
そうするとライブラリファイルは全てlibで始まり、拡張子をaとしなければいけないということでしょうか?

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

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#4

投稿記事 by ISLe » 13年前

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

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

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

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

#5

投稿記事 by ぬっち » 13年前

なるほど・・・いろいろ参考になります^^

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

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

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

#6

投稿記事 by ぬっち » 13年前

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

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

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

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#7

投稿記事 by ISLe » 13年前

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

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

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

#8

投稿記事 by ぬっち » 13年前

解決のチェックを入れるのを忘れていました。
ISLeさんいろいろとありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る