CMake: Eigen3 включает каталоги, необходимые для третьего проекта

Я реализовал библиотеку, которая использует Eigen3. Следующие строки являются частью CMake этой библиотеки:

#EIGEN
find_package(Eigen3 REQUIRED) 
include_directories(${EIGEN3_INCLUDE_DIR})

И Eigen3 найден, и моя библиотека компилируется без проблем.

Сложность возникает, когда я использую свою библиотеку в другом проекте. Этот проект не имеет ничего общего с Eigen, он там не используется. Однако, если я не включу в этот проект каталоги включения Eigen, его компиляция завершится ошибкой.

Моя библиотека скомпилирована как динамическая, и я предполагаю, что в ней отсутствуют некоторые элементы Eigen, и поэтому проекту также нужны каталоги включения Eigen. Любая идея о том, как это исправить?

Спасибо.

PS: я использую Ubuntu 13.04 и использую QtCreator в качестве IDE.


person jotaraul    schedule 07.05.2014    source источник
comment
Почему бы не задать этот вопрос на answers.ros.org?   -  person BenC    schedule 07.05.2014
comment
@BenC Зачем спрашивать об этом на ros?   -  person luk32    schedule 07.05.2014
comment
@ luk32, потому что он сказал (перед редактированием), что проблема возникает, когда он использует ROS, а ROS использует специальную систему на основе CMake (catkin).   -  person BenC    schedule 07.05.2014
comment
@BenC Я просто не вижу информации об этом. Мне очень любопытно, вы сделали вывод по поведению? Это было бы очень здорово!   -  person luk32    schedule 07.05.2014
comment
Извините за редактирование. Первоначальная проблема была с узлом ROS (фактически с использованием ROS-Build, а не Catkin), но то же самое справедливо для любого проекта, использующего мою библиотеку. Спасибо за ваши ответы :)   -  person jotaraul    schedule 07.05.2014
comment
@ luk32 не волнуйся, никакой джедайской уловки не было ;-)   -  person BenC    schedule 07.05.2014
comment
@jotaraul способ pkg-config, который я указал в своем ответе, работает и с rosbuild, хотя вам определенно следует подумать о переходе на сережку в какой-то момент (на самом деле переход занимает несколько минут).   -  person BenC    schedule 07.05.2014


Ответы (3)


Eigen — это библиотека только для заголовков (за исключением некоторых привязок blas). Единственный способ убедиться, что Eigen не требуется в качестве зависимости времени сборки, когда используется ваша библиотека, — это включать только заголовки Eigen в исходные файлы вашей библиотеки и не включать их в заголовки. Для этого может потребоваться некоторое обертывание типов и функций Eigen с помощью PIMPL или чего-то подобного. .

Если это уже так, в вашем вопросе отсутствует информация.

person rubenvb    schedule 07.05.2014

Как сказал @rubenvb, Eigen - это только заголовок. Однако вы можете также захотеть предоставить некоторые функции шаблона, и в этом случае вам нужно добавить Eigen в каталоги include другого проекта. Более того, в какой-то момент у вас могут быть другие зависимости, которые просто невозможно скрыть, как советовал @rubenvb. Но не волнуйтесь! Для проекта CMake, если вы создаете файл pkg-config для своей библиотеки, вы можете просто использовать:

find_package(PkgConfig)
pkg_check_modules(YourLib REQUIRED yourlib)
include_directories(${YourLib_INCLUDE_DIRS})

Таким образом, это будет прозрачно для пользователя. Любые другие зависимости также будут обрабатываться одновременно. Обратите внимание, что библиотеки и определения также доступны. Все это объясняется в документации по CMake pkg_check_modules.

В особом случае узлов ROS (о котором вы спрашивали перед редактированием) включение также может быть выполнено автоматически с помощью catkin, когда вы указываете, что ваша библиотека является зависимостью узла ROS. Для получения дополнительной информации ознакомьтесь с документацией по catkin.

person BenC    schedule 07.05.2014

Если вы включаете заголовки Eigen в свои заголовки, то Eigen является общедоступной зависимостью вашего проекта.

http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html

Смотрите также

http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html

(хотя Эйген пока не создает ИМПОРТНЫЕ цели).

person steveire    schedule 07.05.2014