Tutorial - use cmake to compile static library and then use this library


First job is to compile a static library stat.a


  • Two source files are involved in this library: func1.c and func2.c

func1.c
void func1(int *i)
{
    *i = 8;
}

func2.c
void func2(int *i)
{
    *i = 10;
}


  • Create a cmake file "CMakeLists.txt"

cmake_minimum_required(VERSION 2.8.12.2)
project(test) # project name
set(CMAKE_BUILD_TYPE Release)
include_directories("directory_to_include_files")
set(SOURCES "func1.c" "func2.c") # source files
add_library(ctest_cmake STATIC ${SOURCE}) # generate static library *.a


  • Add folder "build", inside "build", run:

$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home_dir/static_lib_examples/build
$ make
[100%] Built target ctest_cmake

at this point, a static library libc_test_cmake.a is seen in "build" folder.


  • Create a "run" folder, in this folder, add main function and include files.

#include <stdio.h>
#include "stat.h"

int main()
{
        int output;
        func1(&output);
        printf("output1 is %d\n", output);
        func2(&output);
        printf("output2 is %d\n", output);
        return 0;
}

and include file stat.h:

void func1(char *);
void func2(char *);


  • Create another cmake file inside "run" folder, CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12.2)
project(test)

set(PROJECT_LINK_LIBS libctest_cmake.a)
link_directories(/home_dir/static_lib_examples/build)
add_executable(test.exe test.c)
target_link_libraries(test.exe ${PROJECT_LINK_LIBS}) #link *.a to test.exe


  • Next, run cmake and make:

$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home_dir/static_lib_examples/run
$ make
[100%] Built target test.exe


At this point, executable file "test.exe" is generated.

$ ./test.exe 
output1 is 8
output2 is 10


Summary:

  1. by using cmake, users do not need to write make files.

  2. Two cmake files are involved here, the first one is to compile a static library, and the second one is to use this static library.


References:

1. Static, Shared Dynamic and Loadable Linux Libraries


2. Introduction to CMake by Example