CMakeを用いたCのHello Worldプログラムの実行

2023-12-09プログラミング

はじめに

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で指定しなければならなかったことは全部自動でやってくれる。

2023-12-09プログラミング

Posted by tech-biz-creator