Dev-C++ предлагает неполный графический интерфейс для многочисленных опций командной строки GCC: во многих случаях пользователи должны настраивать свои проекты, вводя в текстовые поля опции командной строки. Кроме того, его менеджер проектов может управлять только одним проектом, а визуальный отладчик ненадежен. Несмотря на эти ограничения, Dev-C++ поддерживается большим сообществом пользователей, включая студентов многих университетов. Это хорошая среда для того, кто хочет изучить С++, но не имеет никаких инструментов для разработки на С++.
John, Paul, George, and Ringo
Co времен, когда в 1978 году Брайан Керниган (Brian Kernighan) и Деннис Ритчи (Dennis Ritchie) опубликовали книгу The С Programming Language (Язык программирования С) , стало традицией начинать изучение нового языка программирования с написания, компиляции и запуска небольшой программки, которая печатает в консоли «Hello, World!» («Привет, мир!»). Так как эта глава описывает статические и динамические библиотеки, а также исполняемые файлы, мне потребуется несколько более сложный пример.
Примеры 1.1, 1.2 и 1.3 представляют исходный код приложения hellobeatles , которое выводит текст
John, Paul, George, and Ringo
на консоль. Это приложение можно написать в виде единого исходного файла, но я разбил его на три модуля: статическую библиотеку libjohnpaul , динамическую библиотеку libgeorgeringo и исполняемый файл hellobeatles . Более того, хотя каждая из этих библиотек могла бы быть легко реализована как один заголовочный файл и один файл .cpp , я, чтобы проиллюстрировать компиляцию и компоновку проектов, содержащих более одного исходного файла, разбил реализацию на несколько исходных файлов.
Прежде чем вы начнете прорабатывать рецепты в этой главе, создайте четыре расположенные на одном уровне директории johnpaul , georgeringo , hellobeatles и binaries . В первые три директории поместите исходные файлы из примеров 1.1, 1.2 и 1.3. Четвертая директория будет использоваться для двоичных файлов, генерируемых IDE.
Исходный код libjohnpaul представлен в примере 1.1. Открытый интерфейс libjohnpaul состоит из одной функции johnpaul()
, объявленной в заголовочном файле johnpaul.hpp . Функция johnpaul()
отвечает за печать:
John, Paul,
на консоль. Реализация johnpaul()
разбита на два. исходных файла — john.cpp и paul.cpp , каждый из которых отвечает за печать одного имени.
Пример 1.1. Исходный код libjohnpaul
johnpaul/john.hpp
#ifndef JOHN_HPP_INCLUDED
#define JOHN_HPP_INCLUDED
void john(); // Печатает "John, "
#endif // JOHN _HPP_INCLUDED
johnpaul/john.cpp
#include
#include "john.hpp"
void john() {
std::cout << "John, ";
}
johnpaul/paul.hpp
#ifndef PAUL_HPP_INCLUDED
#define PAUL_HPP_INCLUDED
void paul(); // Печатает " Paul, "
#endif // PAUL_HPP_INCLUDED
johnpaul/paul.cpp
#include
#include "paul.hpp"
void paul() {
std::cout << "Paul, ";
}
johnpaul/johnpaul.hpp
#ifndef JOHNPAUL_HPP_INCLUDED
#define JOHNPAUL_HPP_INCLUDED
void johnpaul(); // Печатает "John, Paul, "
#endif // JOHNPAUL_HPP_INCLUDED
johnpaul/johnpaul.cpp
#include "john.hpp"
#include "paul.hpp"
#include "johnpaul.hpp"
void johnpaul() {
john();
paul();
}
Исходный код libgeorgeringo представлен в примере 1.2. Открытый интерфейс libgeorgeringo состоит из одной функции georgeringo()
, объявленной в заголовочном файле georgeringo.hpp . Как вы могли догадаться, функция georgeringo()
отвечает за печать:
George, and Ringo
на консоль. И снова реализация georgeringo()
разделена на два исходных файла — george.cpp и ringo.cpp .
Пример 1.2. Исходный код libgeorgeringo
georgeringo/george.hpp
#ifndef GEORGE_HPP_INCLUDED
#define GEORGE_HPP_INCLUDED
void george(); // Печатает "George, "
#endif // GEORGE_HPP_INCLUDED
georgeringo/george.cpp
#include
#include "george.hpp"
void george()
std::cout << "George, ";
}
georgeringo/ringo.hpp
#ifndef RINGO_HPP_INCLUDED
#define RINGO_HPP_INCLUDED
void ringo(); // Печатает "and Ringo\n"
#endif // RINGO_HPP_INCLUDED
georgeringo/ringo.cpp
#include
#include "ringo.hpp"
void ringo() {
std::cout << "and Ringo\n";
}
georgeringo/georgeringo.hpp
#ifndef GEORGERINGO_HPP_INCLUDED
#define GEORGERINGO_HPP_INCLUDED
// определите GEORGERINGO_DLL при сборке libgeorgeringo.dll
#if defined(_WIN32) && !defined(__GNUC__)
#ifdef GEORGERINGO_DLL
# define GEORGERINGO_DECL __declspec(dllexport)
#else
# define GEORGERINGO_DECL __declspec(dllimport)
Читать дальше