Кроссплатформенное построение, стандартные структуры каталогов, переменные среды - PullRequest
1 голос
/ 04 октября 2010

Я начал использовать CMake в качестве инструмента сборки для кроссплатформенной программы командной строки, которая требует FFTW3 и Boost.Format.Я знаком с Unix-подобными стандартными структурами каталогов для заголовков и двоичных файлов установленных библиотек, но мне интересно, что такое квазистандарт на платформах Windows относительно того, как и где библиотеки установлены, организованы и т.д.переменные среды, которые я мог бы использовать в своих скриптах CMakeLists.txt / FindXXX.cmake для поиска библиотек?Где я должен разместить заголовки и двоичные файлы FFTW3 на платформе Windows?Имеет ли смысл устанавливать что-то вроде pkg-config на коробку Windows?Очевидно, я не хочу жестко кодировать пути библиотек, поэтому он просто работает на моем Windows-устройстве с точно такой же структурой каталогов.

TIA, sellibitze

Ответы [ 3 ]

1 голос
/ 04 октября 2010

Путь установки по умолчанию для Windows обычно выглядит как C:\Program Files\<company name>\<app name>\ или C:\Program Files\<app name>\. Тем не менее, FFTW поставляется в виде zip-файла, и пользователь сам решает, куда его поместить. Возможно, я бы попросил модуль поиска CMake проверить два вышеупомянутых места и, если ничего не найдено, выложить информативное сообщение.

Может быть, у кого-то еще будет лучшее предложение.

0 голосов
/ 05 октября 2010

CMake имеет интересную особенность в том, что он хранит кэш значений, которые вы в противном случае указали бы в командной строке ./configure для нестандартных расположений библиотеки.

Мой способ ведения дел следующий:

  • если библиотека поставляется с установщиком, например, версией Windows OpenSSL, я установлю ее в рекомендованной папке, т.е. C: \ Program Files \ OpenSSL .
  • если библиотека поставляется в виде zip-файла, я обычно распаковываю их в каталог C: \ dev , чтобы облегчить дальнейшую миграцию и сделать папки короче, чтобы их легче было найти.

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

Вместо этого я буду затем использовать графический интерфейс CMake для поиска каталогов, в которых расположены заголовочные файлы и файлы библиотек, и вручную устанавливать правильные папки. Пока кеш не удален, эти пути останутся в CMakeCache.txt, даже если файлы CMakeLists.txt изменены.

В некоторых случаях установленные библиотеки устанавливают переменные среды, которые модули CMake могут использовать для их поиска, например Boost (переменная BOOST_ROOT). Это позволяет очень легко использовать установленный Boost в Windows с CMake, как вы можете видеть здесь:

##### Boost libraries #####
include(FindBoost)

if(MSVC)
  find_package(Boost 1.40.0 REQUIRED) # msvc autolink support means we don't specify libs
else(MSVC)
  find_package(Boost 1.40.0 REQUIRED COMPONENTS system)
endif(MSVC)

include_directories(${Boost_INCLUDE_DIRS})
set(Boost_USE_STATIC_LIBS ON)

link_directories(${Boost_LIBRARY_DIRS})

Затем вы можете связать свои исполняемые файлы с Boost, выполнив следующее:

add_executable(program_example program_example.cpp)
target_link_libraries(program_example ${Boost_LIBRARIES})
0 голосов
/ 04 октября 2010

Рассматривали ли вы необходимость установки Cygwin для целей Windows?Это, по крайней мере, решило бы вопрос о том, каких стандартов придерживаться.

...