Показаны сообщения с ярлыком cpp. Показать все сообщения
Показаны сообщения с ярлыком cpp. Показать все сообщения

четверг, 2 сентября 2010 г.

Сборка log4cxx 0.10.0 в Visual Studio 2010. Детали

Первый пост из серии «Простой проект с использованием CMake, log4cxx, boost». Рассмотрим сборку log4cxx из исходников под Windows с использованием Visual Studio 2010. Соответствующий пост с отдельными деталями здесь.

log4cxx — библиотека от Apache, предназначенная для организации логирования в проектах на C++. Создается впечатление, что разработка заглохла, но библиотека довольно фичаста, плюс семейство библиотек log4-что-то является одним из стандартов в своей области. Поэтому будет использовать ее, хотя стоит обратить внимание и на Boost.Log, и на google-glog.

В качестве базы использована официальная инструкция по сборке. Начнем со скачивания исходников. Необходима сама библиотека (apache-log4cxx-0.10.0.zip) и две вспомогательных для нее: Apache Portable Runtime (apr) и APR-util (там же). Последние версии на момент написания статьи 0.10.0, 1.4.2 и 1.3.9 соответственно. На странице с библиотеками нужно скачивать версии Win32 Source, чтобы использовались правильные символы конца строки.

После скачивания архивов распаковываем их в одну папку. Директории вспомогательных библиотек нужно переименовать в apr и apr-util, убрав из названия номер версии.

После этого необходимо запустить два bat-файла из папки apache-log4cxx-0.10.0, configure.bat и configure-aprutil.bat. Можно использовать проводник, но я предпочитаю консоль. Второй батник использует sed, который должен быть доступен в $PATH. Скачать его можно здесь. Подробности установки sed рассматривать не будем, если нужно, можно задать вопрос в комментарии.

Итак, запускаем батники:

После этого необходимо пропатчить исходники, чтобы они собирались 2010-ой студией. Заходим в Jira проекта и скачиваем прикрепленный к талону патч. Для его применения можно использовать TortoiseSVN: щелкаем по файлу правой кнопкой и выбираем пункт TortoiseSVN --> Apply patch. Черепаха спросит, к файлам из какой папки должен быть применен этот патч. Укажем папку, куда были распакованы архивы. После этого в маленьком окошке со списком файлов выберем все cpp-файлы и все h-файлы кроме log4cxx.h и log4cxx_private.h


Щелкаем по ним правой кнопкой и выбираем пункт Patch Selected. Применение изменений должно пройти без ошибок, никакой файл из приведенных в списке не должен стать красным.

После применения патча запускаем VS и открываем в ней apache-log4cxx-0.10.0\projects\log4cxx.dsw. Соглашаемся со всеми предложениями, связанными с конвертацией в проект нового формата. Во время этого процесса студия потеряет данные о зависимости log4cxx.dll от других вспомогательных библиотек, поэтому проект соберется, но не слинкуется. Восстановим зависимости, как указано в другом посте, упомянутом выше.

В Solution Explorer'е выбираем проект log4cxx и открываем его свойства. Открываем страницу свойств Configuration Properties --> Linker --> General и для конфигурации Debug в пункте Additional Library Directories указываем следующее, говоря тем самым линковщику, где искать дополнительные библиотеки:
..\..\apr\LibD
..\..\apr-util\LibD
..\..\apr-util\xml\expat\lib\LibD



Затем необходимо указать с какими именно дополнительными библиотеками нужно осуществлять линковку. Для этого в том же окне на странице Configuration Properties --> Linker --> Input выбираем пункт Additional Library Dependencies. Там указываем дополнительные библиотеки к уже имеющимся:
apr-1.lib
aprutil-1.lib
xml.lib

Для конфигурации Relese нужно сделать все тоже самое, с тем лишь исключением, что вместо папки LibD нужно будет указывать LibR. Сохраняем изменения и запускаем компиляцию, щелкнув по проекту log4cxx правой кнопкой и выбрав пункт Build.

После компиляции в папках apache-log4cxx-0.10.0\projects\Debug и apache-log4cxx-0.10.0\projects\Release появятся бинарные файлы. Нас интересует log4cxx.dll и log4cxx.lib, позже будем ссылаться на них как на дебажные и релизные версии log4cxx.

Update: VS 2010 на XP почему-то может не собрать проект, ссылаясь на ошибку, связанную с mt.exe. Помогает сборка по частям: aprutil, xml, apr и log4cxx.

Простой проект с использованием CMake, log4cxx, boost

Планируется серия постов, посвященных разработке простого проекта на C++, использующего библиотеки boost, log4cxx, и собираемого CMake. Будет рассмотрена интеграция с Visual Studio 2010 и Eclipse Helios CDT, соответственно проект будет собираться под Windows и Linux. Отдельные детали уже были описаны в предыдущих постах, сейчас же рассмотрим все в подробностях.

Примерный план такой:

  1. Сборка log4cxx под Windows

  2. Установка boost под Windows
  3. Разработка структуры проекта
  4. Написание кода
  5. Конфигурация log4cxx
  6. Сборка CMake'ом под Windows
  7. Интеграция с Visual Studio 2010
  8. Установка библиотек и сборка CMake'ом под Linux
  9. Интеграция с Eclipse Helios CDT
Больше внимания будет уделено Windows, поскольку для нее все оказалось сложнее и не так прямолинейно, как для Linux.

среда, 1 сентября 2010 г.

Eclipse: не добавляется слово в пользовательский словарь

Свежеустановленный Eclipse с CDT не знает слова destructor и подчеркивает его как неправильное. Если навести на слово мышь, то появляется всплывающее окно, предлагающее варианты действий. Один из вариантов — добавить слово в пользовательский словарь. Открывается окошко, в поле «User defined dictionary» которого можно указать путь к словарю. Однако это не работает, слово по-прежнему подчеркивается красным.

Ключевой момент — выпадающий список «Select spelling engine to use». В нем должно быть выбрано C/C++ spelling engine.

суббота, 21 августа 2010 г.

Сборка log4cxx 0.10.0 в Visual Studio 2010

log4cxx версии 0.10.0, скачанный с сайта Apache, не собирается. Проблема известная и отмечена в issue tracker'е проекта. В талоне указан патч, который вносит необходимые исправления в код. В него входят некоторые лишние, на мой взгляд, файлы (log4cxx.h, log4cxx_private.h и два xml системы сборки), которые патчить не нужно. После внесения модификаций проект скомпилируется, но не слинкуется. Причина в том, что при конвертации файла проекта в новый формат были утеряны сведения о зависимостях log4cxx.dll от других библиотек.

Для конфигурации Release необходимо внести следующие изменения:

log4cxx Properties --> Configuration Properties --> Linker --> General --> Additional Library Directories


log4cxx Properties --> Configuration Properties --> Linker --> Input --> Additional Library Dependencies


Для конфигурации Debug имена директорий LibR нужно поменять на LibD.

PS: Процесс сборки описан здесь.

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

CMake, Visual Studio, отладка

Чтобы отлаживать проект CMake'а в студии, необходимо указать следующее в поле Command страницы Debugging свойств проекта:
$(TargetDir)$(ConfigurationName)\$(TargetName)\$(TargetFileName)

Update:Для Visual Studio 2010 путь будет другой.

$(ProjectDir)$(Configuration)\$(ProjectName)\$(ProjectName).exe

Так же имеет смысл указать Working Directory, использовав путь к исполняемому файлу. Для VS 2010:

$(ProjectDir)$(Configuration)\$(ProjectName)\

Update2: эти установки сохраняются не в файле проекта, а файле *.vcxproj.user

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

Иерархия директорий для разработки библиотеки на C++

Предположим, мы разрабатываем на C++ библиотеку и программу, ее использующую. Библиотека должна предоставлять заголовочные файлы для использования ее классов, но эти файлы не должны раскрывать внутренней иерархии директорий проекта библиотеки.

Можно использовать следующую структуру папок (проект описан в другом посте):
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
Примем соглашение, по которому клиент библиотеки вправе обращаться только к заголовочным файлам из папки include, а файлы в этой папке будут ссылаться на другие файлы из каталога библиотеки. Таким образом поставленная задача инкапсуляции будет решена.

Но возникает другая проблема: include guard в одноименных файлах (core.hpp в примере) может совпадать, в этом случае целевой файл не будет заинклюжен. Для этого придется принять еще одно соглашение, по которому guard во внешних файлах будет называться, например, CLASS_NAME_HPP, а во внутренних _CLASS_NAME_HPP_.

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

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