Компиляция библиотек с CMake под Cygwin - PullRequest
2 голосов
/ 21 сентября 2010

Я пытался скомпилировать TinyXML, используя CMake как своего рода мини-проект, пытаясь изучить CMake. Кроме того, я пытаюсь собрать его в динамическую библиотеку и установить сам, чтобы он работал.

Пока мне удалось заставить его скомпилировать и установить, НО он компилируется в .dll и .dll.a, и единственный способ заставить его работать - это установить его в / bin и / lib что позволяет установить оба файла в обе папки. Эта установка работает, но я предполагаю, что .dll должен быть в / bin, а .dll.a должен быть в / lib. Это какая-то специфическая проблема Cygwin или я делаю что-то не так?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010

.dll - это файл библиотеки времени выполнения, который должен присутствовать в целевой системе во время выполнения (и находиться там в $ PATH).Файл .dll.a - это библиотека импорта для DLL, которая должна присутствовать на компиляторе во время компоновки.Вам необходимо распространить файл .dll в места, где должна запускаться программа, а файлы .dll и .dll.a - в места, где библиотека используется для связи с другими программами.вам не нужен файл .dll.a только на машинах, на которых запущена программа.

Если вы не хотите создавать общую библиотеку, вы можете сообщить об этом cmake с ключевым словом static. в команде add_library:

add_library(mylib STATIC foo.c bar.cpp)

Таким образом, общая библиотека не будет создана, но компоновщик добавит код из библиотеки в окончательный исполняемый файл.

0 голосов
/ 24 марта 2015

Вам нужно указать место назначения для каждого типа файла.

.dll считается библиотекой RUNTIME, а .a является архивом.На всякий случай, для других платформ вам, вероятно, понадобится запись LIBRARY (для файлов .so).

install( TARGETS ${PROJECT_NAME}
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
)
...