質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2211閲覧

GCCで外部ライブラリを利用した時に発生するリンクエラーが治せない

helix_a

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/10/17 01:38

GCCを利用してプログラムをビルドしたい

外部ライブラリの圧縮ファイルをインストールしてから解凍、コンパイルした後に

$sudo make install

インストールしました。
外部ライブラリを使ったソースコード(test.c)をgccでコンパイルした所

undefind reference to (外部ライブラリの中の関数名)
undefind reference to (外部ライブラリの中の関数名)
undefind reference to (外部ライブラリの中の関数名)
:

と出てリンクエラーになります

該当のソースコード

$gcc test.c -I SDL2/SDL2-2.0.5/include (解凍した時にSDL.hのある場所) -I SDL2/SDL2_ttf-2.0.14  (解凍した時にSDL_ttf.hのある場所) -L /usr/local/lib     (コンパイルしたライブラリをインストールした場所)

試したこと

/usr/local/libに静的ライブラリ、動的ライブラリが両方存在する事を確認

オプションの場所の変更
オプション-lmをつけてみる
sudo で管理者権限を与えてみる

気になる点

/usr/local/libに静的なライブラリと動的なライブラリ両方入っているからODR違反になっている?
という可能性は考えられますか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/10/17 01:49 編集

gccのオプションに「-lライブラリ名」が要るのでは? -lSDL2 -lSDL2_ttf -lSDL2_image -lSDL2_mixer みたいなやつ (必要なのだけ付ける)
dodox86

2021/10/17 01:50

> オプション-lmをつけてみる これは数学関連のライブラリlibmを個別にリンクしようとしている訳で、そうであれば違いますね。 > -L /usr/local/lib はライブラリの存在するディレクトリ(の基点となるところ)を指定しているだけですね。 その、外部ライブラリの関数群が収められているライブラリファイル自体を指定する必要があるのではないでしょうか。 libhoge.a という名前だったら、だったら "-lhoge" ですね。 それでもダメだったらライブラリ自体を作成したときのgccのコンパイルの状況が違っていて、リンクのための関数名が変わってしまっている、とか。
dodox86

2021/10/17 02:05

私のコメントへの補足: > それでもダメだったらライブラリ自体を作成したときのgccのコンパイルの状況が違っていて、リンクのための関数名が変わってしまっている、とか。 "シンボル名"と書いたほうがもう少し正確でしたでしょうか。C言語の関数では関数名が変わることはないと思うのですが、質問者さんの別の質問でラズパイ3で上での動作を前提とされていたようなので、クロスプラットフォームでのgccのオプション違いによる生成物の違い、ということを懸念してのコメントでした。
helix_a

2021/10/17 09:08

こんばんは。 回答をいただきありがとうございます。 おかげさまでビルドする事に成功しました! 原因は使用する静的ライブラリを指定していなかった事が原因でした。 jbpb0さん、参考例まで書いていただきありがとうございます。 dodox86さん、試した事に対する詳しい説明までいただきありがとうございます。
helix_a

2021/10/17 09:19

ライブラリのある場所と使うライブラリ群をしっかりと指定しないといけなかったのですね。 動的ライブラリと静的ライブラリが同じパスに存在する状態でも ”両方指定する”ということがなければ関数が被る事なくODR違反にはならないという事が理解できました!
dodox86

2021/10/17 10:03

解決したのであればその方法、原因をご自身で回答として投稿して自己解決とし、質問を閉じましょう。
helix_a

2021/10/17 11:54

アドバイスありがとうございます。 申し訳ありませんでした。
guest

回答1

0

自己解決

利用するライブラリを指定していなかった為、関数が見つからなかったみたいです。

質問欄にある
該当のソースコード(下記)

$gcc test.c -I SDL2/SDL2-2.0.5/include (解凍した時にSDL.hのある場所) -I SDL2/SDL2_ttf-2.0.14  (解凍した時にSDL_ttf.hのある場所) -L /usr/local/lib     (コンパイルしたライブラリをインストールした場所)

の続きに

-lSDL2 -lSDL2_image -lSDL2_ttf

と追加する事でコンパイルする事に成功しました。

投稿2021/10/17 12:05

helix_a

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問