Help us understand the problem. What is going on with this article?

グラフィック系のライブラリを用いたC言語のプログラムをコンパイルする際のCMakeLists.txtの記述について(gccのコマンド付き)

More than 5 years have passed since last update.

グラフィック系のライブラリを用いたC言語のプログラムをコンパイルする際のCMakeLists.txt(CMakeのコンパイル設定ファイル)の記述についてまとめてみます(gccでコンパイルするという人にも役立つ記事となっております)。

検証環境

以下の環境にて検証を行っております。

  • Ubuntu 14.04 LTS
    • CMake 2.8
    • CLion 1.0.3(CMake 3.2 使用)

X Window System(X11) (+Xpm)を使用する場合

gccのコマンド

パターン コマンド
X Window System(X11)のみ gcc -Wall -o <実行ファイル名> <ソースファイル名> -lX11
X Window System(X11) + Xpm gcc -Wall -o <実行ファイル名> <ソースファイル名> -lX11 -lXpm

CMakeLists.txtの記述

全体の記述

CMakeLists.txtの記述 内容
find_package(X11) X Window System(X11)のパッケージを参照します。

コンパイル対象ごとの記述

CMakeLists.txtの記述 gccのオプション 内容
add_executable(<実行ファイル名> <ソースファイル名>) -o <実行ファイル名> <ソースファイル名> 実行ファイル名とソースファイル名の対応関係を登録します。
target_link_libraries(<実行ファイル名> Xpm) -lXpm 実行ファイルとXpmのライブラリをリンクさせます(Xpmを使用する場合のみ)
target_link_libraries(<実行ファイル名> ${X11_LIBRARIES}) -lX11 実行ファイルとX Window System(X11)のライブラリをリンクさせます。

余談

  • XpmをUbuntuで使う場合、sudo apt-get install libxpm-devでライブラリをインストールせねばなりません。
  • Xpmを使用する場合、X11/xpm.hをインクルードしておけば、(X11/Xlib.h等のインクルードなしで、)X Window System(X11)の関数を使用することができます。

GTK2を使用する場合

gccのコマンド

gccでコンパイルする際には、どちらのパターンでも構いませんが、この記事では、パターン1の記述を元に説明していきます。

パターン コマンド
1 gcc -Wall -o <実行ファイル名> <ソースファイル名> $(pkg-config --cflags gtk+-2.0) $(pkg-config --libs gtk+-2.0)
2 gcc -Wall -o <実行ファイル名> <ソースファイル名> $(pkg-config --cflags --libs gtk+-2.0)

CMakeLists.txtの記述

全体の記述

CMakeLists.txtの記述 gccのオプション 内容
find_package(GTK2) GTK2のパッケージを参照します。
include_directories(${GTK2_INCLUDE_DIRS}) $(pkg-config --cflags gtk+-2.0) GTK2のインクルードパスを指定します。

コンパイル対象ごとの記述

CMakeLists.txtの記述 gccのオプション 内容
add_executable(<実行ファイル名> <ソースファイル名>) -o <実行ファイル名> <ソースファイル名> 実行ファイル名とソースファイル名の対応関係を登録します。
target_link_libraries(<実行ファイル名> ${GTK2_LIBRARIES}) $(pkg-config --libs gtk+-2.0) 実行ファイルとGTK2のライブラリをリンクさせます。

math.h や tgmath.hを使用する場合

gccのコマンド

コマンド
gcc -Wall -o <実行ファイル名> <ソースファイル名> -lm

CMakeLists.txtの記述

コンパイル対象ごとの記述

CMakeLists.txtの記述 gccのオプション 内容
add_executable(<実行ファイル名> <ソースファイル名>) -o <実行ファイル名> <ソースファイル名> 実行ファイル名とソースファイル名の対応関係を登録します。
target_link_libraries(<実行ファイル名> m) -lm 実行ファイルとmath.h や tgmath.hのライブラリをリンクさせます。

余談

  • tgmath.hは、C99で定められた計算用ライブラリで、インクルードすると、math.h と complex.hも同時にインクルードされます。
    複素数も扱えるようになるという画期的なライブラリですが、扱い方が少々難しい印象があります......。

OpenGL + glutを使用する場合

gccのコマンド

パターン コマンド
(glutで始まる関数を除く)gluで始まる関数が使われていない gcc -Wall -o <実行ファイル名> <ソースファイル名> -lGL -lglut
(glutで始まる関数を除く)gluで始まる関数が使われている gcc -Wall -o <実行ファイル名> <ソースファイル名> -lGL -lGLU -lglut

CMakeLists.txtの記述

全体の記述

CMakeLists.txtの記述 内容
find_package(GLUT) glutのパッケージを参照します。
find_package(OpenGL) OpenGLのパッケージを参照します。

コンパイル対象ごとの記述

CMakeLists.txtの記述 gccのオプション 内容
add_executable(<実行ファイル名> <ソースファイル名>) -o <実行ファイル名> <ソースファイル名> 実行ファイル名とソースファイル名の対応関係を登録します。
target_link_libraries(<実行ファイル名> ${GLUT_LIBRARY}) -lglut 実行ファイルとglutのライブラリをリンクさせます。
target_link_libraries(<実行ファイル名> ${OPENGL_LIBRARY}) -lGL -lGLU 実行ファイルとOpenGLのライブラリをリンクさせます。

余談

これらを記述したCMakeLists.txtの例

プロジェクトCGというC言語のプロジェクトがあり、その中に以下のコンパイル対象があるとします。

実行ファイル名 ソースファイル名 内容
CG1 CG1.c X Window System(X11) + Xpm使用。
CG2 CG2.c GTK2 と math.h使用。
CG3 CG3.c OpenGL + glut使用。

その際、CMakeLists.txtは次のようになります。

CMakeLists.txt
cmake_minimum_required(VERSION 2.8) #実行できるCMakeのバージョンをver 2.8以降に設定
project(CG C) #プロジェクトCGをC言語のプロジェクトとして生成(Cと書かないと、C++のプロジェクトになります)

add_definitions(-Wall) #警告を全て表示するように設定
find_package(X11)
find_package(GTK2)
find_package(GLUT)
find_package(OpenGL) 
include_directories(${GTK2_INCLUDE_DIRS})

#実行ファイルCG1(X Window System(X11) + Xpm使用)
add_executable(CG1 CG1.c)
target_link_libraries(CG1 Xpm)
target_link_libraries(CG1 ${X11_LIBRARIES})

#実行ファイルCG2(GTK2 と math.h使用)
add_executable(CG2 CG2.c)
target_link_libraries(CG2 m)
target_link_libraries(CG2 ${GTK2_LIBRARIES})

#実行ファイルCG3(OpenGL + glut使用)
add_executable(CG3 CG3.c)
target_link_libraries(CG3 ${GLUT_LIBRARY})
target_link_libraries(CG3 ${OPENGL_LIBRARY})

関連記事

SUZUKI_Masaya
データエンジニア, データアナリスト, エンジニア
mixi
全ての人に心地よいつながりを
http://mixi.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした