CMakeを用いたCのHello Worldプログラムの実行
はじめに
C++のコンパイル環境で有名なCMakeですが、Cもコンパイルできる。
まずは能書き垂れる前に、サンプルソースをさっさと動かします。
環境構築
Ubuntu18.04LTS
# install cmake package
sudo apt-get install cmake
準備するファイル
~/sample/
|-CMakeLists.txt
|-main.c
|-hello.h
|-hello.c
# mkdir project dir under ~/
mkdir sample
cd sample
touch CMakeLists.txt main.cpp hello.hpp hello.cpp
# CMake Version
cmake_minimum_required(VERSION 2.8)
# Project name & Language
project(helloworld C)
# source file & generated file
add_executable(a.out main.c hello.c)
C++ の時は project(helloworld CXX) だったが、C の時は project(helloworld C) である。
#include "hello.h"
int main() {
hello();
}
#ifndef HELLO_H
#define HELLO_H
void hello();
#endif
#include <stdio.h>
#include "hello.h"
void hello() {
puts("Hello World");
}
コンパイル
コンパイルします。
mkdir build
cd build
cmake ..
make
実行結果です。
~/sample/build$ cmake ../
-- The C compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: ~/sample/build
~/sample/build$ make
Scanning dependencies of target hello
[ 33%] Building C object CMakeFiles/hello.dir/main.c.o
[ 66%] Building C object CMakeFiles/hello.dir/hello.c.o
[100%] Linking C executable hello
[100%] Built target hello
実行後、こんなにたくさんファイルができました。
~$ tree sample
sample
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.10.2
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ └── CompilerIdC
│ │ │ ├── a.out
│ │ │ ├── CMakeCCompilerId.c
│ │ │ └── tmp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.c
│ │ ├── hello.dir
│ │ │ ├── build.make
│ │ │ ├── C.includecache
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── DependInfo.cmake
│ │ │ ├── depend.internal
│ │ │ ├── depend.make
│ │ │ ├── flags.make
│ │ │ ├── hello.c.o
│ │ │ ├── link.txt
│ │ │ ├── main.c.o
│ │ │ └── progress.make
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ └── TargetDirectories.txt
│ ├── cmake_install.cmake
│ ├── hello
│ └── Makefile
├── CMakeLists.txt
├── hello.c
├── hello.h
└── main.c
7 directories, 33 files
実行
~/sample/build$ ./hello
Hello World !
考察
- CMakeでCもコンパイル可能。言語をCにするだけ。
- Makefileのように複雑な文法は無いし、gccやMakefileで指定しなければならなかったことは全部自動でやってくれる。