вторник, 3 августа 2010 г.

CMake: консольная программа и статическая библиотека

Необходимо написать программу с консольным интерфейсом, которая будет линковаться со статической библиотекой. Для сборки будет использован CMake.

Сначала создадим необходимую иерархию директорий:
D:\PROJECTS\SIMPLE-THINGS\TRUNK\CMAKE_TEST
│   CMakeLists.txt
│
├───cli
│   │   CMakeLists.txt
│   │
│   └───src
│           main.cpp
│
└───core
    │   CMakeLists.txt
    │
    ├───include
    │       core.hpp
    │
    └───src
            core.cpp
            core.hpp
CMAKE_TEST - главный каталог проекта. Библиотека находится в папке core, сама программа - в папке cli. В каждой из упомянутых папок есть файл CMakeLists.txt, описывающий их содержимое.

CMakeLists.txt в корневой директории проекта:
cmake_minimum_required(VERSION 2.6)
project(CMAKE_TEST)

add_subdirectory(core)
add_subdirectory(cli)
Минимально необходимой для сборки проекта версией CMake является 2.6, проект называется CMAKE_TEST, это имя будет использоваться для обращения к корневой папке из подпроектов. Две команды add_subdirectory, аргументом которых являются имена папок, необходимы для указания подпроектов.

Библиотека core состоит из единственного класса, имеющего следующий вид:
#ifndef _CORE_HPP_
#define _CORE_HPP_

class Core
{
public:
  const char * say();
};

#endif

##include "Core.hpp"

const char * Core::say()
{
  return "hello";
}

Файл проекта библиотеки такой:
set(SRC src/core.cpp)
add_library(core ${SRC})

Первая строка — список исходников, вторая строка — команда на обработку библиотеки под названием core.

Основной класс библиотеки доступен с помощью заголовочного файла:
#ifndef CORE_HPP
#define CORE_HPP

#include "../src/core.hpp"

#endif

Код самой программы предельно прост:
#include <iostream>
#include "core.hpp"

int main(int argc, char **argv)
{
  Core core;
  std::cout << core.say() << std::endl;

  return 0;
}

Особый интерес представляет CMakeLists.txt этого подпроекта:
include_directories(${CMAKE_TEST_SOURCE_DIR}/core/include)
link_directories(${CMAKE_TEST_BINARY_DIR}/core)

set(SRC src/main.cpp)

add_executable(cli ${SRC})
target_link_libraries(cli core)
Команда include_directories определяет папку, где компилятор будет искать заголовочные файлы, подключаемые с помощью include, при этом переменная CMAKE_TEST_SOURCE_DIR указывает на корневую папку проекта. link_directories определяет, где искать библиотеки для линковки, CMAKE_TEST_BINARY_DIR - директория для сборки проекта. 4-ая строка задает список исходников, add_executable говорит, что будет собираться приложение cli.exe, target_link_libraries перечисляет библиотеки, с которым его нужно слинковать. Библиотека core по умолчанию будет статической.

Для сборки в корневой папки проекта необходимо создать директорию build и в ней отдать следующие команды:
cmake ..
msbuild CMAKE_TEST.sln /t:Rebuild /p:Configuration=Release

Исходный код здесь.

1 комментарий: