Повторное использование заголовочных файлов C ++ - PullRequest
2 голосов
/ 06 июня 2010

У меня есть решение Visual C ++ с 2 проектами AlgorithmA & AlgorithmB , и оба имеют общий заголовочный файл RunAlgo.h с объявлением класса. Каждый проект в решении имеет свою собственную уникальную реализацию для заголовочного файла.

Я пытаюсь скомпилировать DLL из общего заголовочного файла RunAlgo.h и добавить ссылку на эту DLL в проектах AlgorithmA & AlgorithmB . Затем я включил отдельный файл определения RunAlgo.cpp в оба моих проекта. Проблема в том, что я получаю ошибки компоновщика при компиляции нового проекта DLL, в котором есть только заголовочный файл.

Итак, вопрос

  1. Может ли заголовочный файл с только объявлением класса быть скомпилирован в DLL ( Подобно библиотеке классов, содержащей интерфейс в C # )?
  2. Для вышеприведенного сценария существует ли лучший подход для повторного использования общего заголовочного файла в проектах?
  3. Должен ли работать вышеуказанный метод (перепроверить мой код?)

Ответы [ 4 ]

4 голосов
/ 06 июня 2010

1 & 3: Нет, это не имеет смысла в C ++.

Библиотеки (динамические или иные) используются только во время компоновки.Во время компиляции объявления должны быть видны компилятору в форме исходного кода.Вот почему, например, вам необходимо явно #include заголовки стандартной библиотеки в дополнение к связыванию со стандартной библиотекой.

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

1 голос
/ 06 июня 2010

Может заголовочный файл только с классом объявление должно быть скомпилировано в DLL

Нет, заголовки обычно включают только объявления. Объявления при компиляции не производят никакого машинного кода, поэтому полученная DLL будет пустой.

Для приведенного выше сценария, есть ли лучший подход для повторного использования общего Заголовочный файл среди проектов?

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

Я не знаю много Visual C ++, но я думаю, что вы могли бы создать третий проект, содержащий общие части (например, заголовок RunAlgo.h), и пометить его как зависимость для AlgorithmA и AlgorithmB проектов.

0 голосов
/ 06 июня 2010

Используйте 2 пространства имен в C ++ для написания 2 разных реализаций с одним и тем же заголовочным файлом

namespace ImplementationA
{
}
namespace ImplementationB
{
}

Когда вы хотите использовать 1-ю реализацию

using implementationA;

или

implementationA::function1();
0 голосов
/ 06 июня 2010

до 1.:

Нет, автономные заголовочные файлы никогда не заканчиваются на dll. Заголовочные файлы включаются в файлы реализации, и именно так они компилируются. Заголовочные файлы обычно распространяются вместе с DLL или библиотекой, если вы хотите разрешить третьим сторонам ссылаться на него.

К 2.:

Почему бы вам не объявить абстрактный базовый класс с интерфейсом для алгоритма и не предоставить две разные реализации, определив два подкласса (AlgorithmA и AlgorithmB), производные от базового класса? Я не понимаю, почему вы хотите разные DLL.

до 3.:

Нет, не должно. См. Пункт 1.

...