0%

CMake Tutorial 2

接續上個範例

我們將add2這個函數從demo中題取出來,建立一個math library,讓其他人使用。
提供header file跟library,header file放在include目錄底下,source code放在lib底下>
我們的header file: MyMath.h

1
2
3
4
#ifndef _MyMath_H_
#define _MyMath_H_
int add2(int, int);
#endif

實作add2.c

1
2
#include "MyMath.h"
int add2(int a, int b) { return a + b; }

重點的CMakeLists.txt部分

1
ADD_LIBRARY(mymath STATIC add2.c)

重新改寫我們的demo

1
2
3
4
5
6
7
#include <stdio.h>
#include "MyMath.h"
int main()
{
printf("%d\n", add2(1, 1));
return 0;
}

以及CMakeLists.txt

1
2
ADD_EXECUTABLE(demo demo.c)
TARGET_LINK_LIBRARIES(demo mymath)

目錄下的CMakeLists.txt也要跟著更新

1
2
3
4
5
6
PROJECT(CMakeDemo C)
cmake_minimum_required(VERSION 2.8)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
SUBDIRS(src lib)

在城市規模小的時候,直接寫Makefile是個比較快的解決方案,不過當規模更大,以及要跨平台的時候,CMake的優勢就出現了。

如何使用編譯參數

上面這個範例,我們是使用static library,我們假設要在編譯的時候選擇是要用static library或是shared library,該怎麼進行。

重新改寫 lib/CMakeLists.txt

1
2
3
4
5
if (ENABLE_SHAREDLIB)
ADD_LIBRARY(mymath SHARED add2.c)
else()
ADD_LIBRARY(mymath STATIC add2.c)
endif()

之後我們在產生Makefile之前下以下參數就能選擇了

1
$ cmake .. -DENABLE_SHAREDLIB=TRUE

這樣就能選擇編譯成shared librarry了。