TransWikia.com

g++ コンパイラでライブラリのリンクを行うための -L -lオプションの使い方がわからない

スタック・オーバーフロー Asked by user36373 on September 1, 2021

参考サイト(Qiita)のライブラリパスをコマンドラインオプションで指定する場合という場所に乗せられている提示コード
gcc -o sample -L/usr/local/lib/hoge -lfoo -lbar main.c ですが、これはコマンドプロンプトでは提示画像のようなディレクトリ構造の場合どうしたらいいのでしょうか?

自分はg++を使うので g++ -Lライブラリを探すディレクトリ -lライブラリ名 -lライブラリ名 ファイル名.cpp ファイル名cpp としていますが、これが間違えているのでしょうか?

提示画像は参照先であるSDLライブラリのlib/x64/の中の.lib.dll系の場所
ソースとヘッダーはtestディレクトリに
headerとsource
という名前でディレクトリ分けしてあります。以前間違えたときそのディレクトリには#include ○○がありませんよ教えてくれたのでinclude パスは通っているはず。
画像の説明をここに入力

g++ -L../SDL2/lib/x64/ -lSDL2 -lSDL2_ttf Game.cpp main.cpp
    C:Usersユーザー名Desktoptestsource>g++ -L../SDL2/lib/x64/-lSDL2-lSDL2_ttf main.cpp Game.cpp
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x48): undefined reference to `TTF_Init'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x8e): undefined reference to `TTF_OpenFont'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0xa3): undefined reference to `SDL_GetError'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0xc1): undefined reference to `SDL_Init'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0xcf): undefined reference to `SDL_GetError'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0xdf): undefined reference to `SDL_Log'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x11d): undefined reference to `SDL_CreateWindow'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x130): undefined reference to `SDL_GetError'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x140): undefined reference to `SDL_Log'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x167): undefined reference to `SDL_CreateRenderer'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x17c): undefined reference to `SDL_GetError'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x18c): undefined reference to `SDL_Log'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x240): undefined reference to `SDL_PollEvent'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x269): undefined reference to `SDL_GetKeyboardState'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x2e2): undefined reference to `SDL_GetTicks'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x31e): undefined reference to `SDL_GetTicks'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x5ba): undefined reference to `SDL_SetRenderDrawColor'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x5c8): undefined reference to `SDL_RenderClear'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x5dc): undefined reference to `TTF_OpenFont'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x610): undefined reference to `SDL_SetRenderDrawColor'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x641): undefined reference to `SDL_RenderFillRect'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x65d): undefined reference to `SDL_RenderFillRect'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x68e): undefined reference to `SDL_RenderFillRect'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x71f): undefined reference to `SDL_RenderFillRect'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x7b8): undefined reference to `SDL_RenderFillRect'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x808): undefined reference to `TTF_RenderUTF8_Blended'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x826): undefined reference to `SDL_CreateTextureFromSurface'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x85a): undefined reference to `SDL_SetRenderDrawColor'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x886): undefined reference to `SDL_QueryTexture'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x90a): undefined reference to `SDL_RenderCopy'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x918): undefined reference to `SDL_RenderPresent'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x926): undefined reference to `SDL_FreeSurface'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x934): undefined reference to `SDL_DestroyTexture'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x942): undefined reference to `TTF_CloseFont'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x95d): undefined reference to `SDL_DestroyRenderer'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x96a): undefined reference to `SDL_DestroyWindow'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x96f): undefined reference to `SDL_Quit'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../libmingw32.a(main.o):(.text.startup+0xc0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

環境 Windows 10

参考サイト:
C/C++のコンパイルについてメモ – Qiita
C++ コンパイラオプション

2 Answers

コンパイルオプションでは -L../SDL2/lib/x64/ と指定されており64bitかのように見えますが、エラーメッセージでは

c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:UsersMATSUZ~1AppDataLocalTempccd88skb.o:Game.cpp:(.text+0x48): undefined reference to `TTF_Init'

と32bitリンカが動作しています。アーキテクチャを一致させましょう。

あと、ディレクトリ構成とファイル一覧を見る限りMinGW用ではなくVisual C++用を使用されているように見えます。コンパイラーも一致させましょう。
Windows標準のVisual C++ではSDL2.lib等、拡張子は.libとなります。MinGWはこれに従っておらず独自形式でlibSDL2.a等、拡張子は.aとなります。


g++ では拡張子を.aにする必要があってx32を指定するかg++でx64にするかしてくださいっていうことでいいのでしょうか?

使用するプラットフォーム、コンパイラーを定めてください。Windowsを使うのだとは思われますが、

  • x64とするのかx86とするのか
  • コンパイラーはVisual C++を使用するのか、MinGWを使用するのか

その上で、どこからモジュールを入手したのか質問文に記載がありませんが、公式サイトには

  • SDL2-devel-2.0.12-VC.zip (Visual C++ 32/64-bit)
  • SDL2-devel-2.0.12-mingw.tar.gz (MinGW 32/64-bit)

が用意されているので、適切なものを導入してください。

Correct answer by sayuri on September 1, 2021

-L および -l オプションを使う場合、続くディレクトリ名やライブラリ名は スペースを挟まずに 指定する必要があります。

NGな例:

gcc -L dir ...
      ^

正しい例:

gcc -Ldir ...

Answered by cubick on September 1, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP