CMAKE: создать библиотеку и ссылаться на нее - PullRequest
11 голосов
/ 19 октября 2011

Я пытаюсь использовать cmake (в Linux с GNU make и g ++) для создания проекта с двумя подкаталогами: MyLib и MyApp. MyLib содержит источник для статической библиотеки; MyApp необходимо связать с этой библиотекой. Я пытаюсь собрать на Linux сгенерированные make-файлы, используя следующий CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (MyProj)
include_directories (MyLib)
file(GLOB MyLibSrc MyLib/*.cpp)
add_library(MyLibrary STATIC ${MyLibSrc})
file(GLOB MyAppSrc MyApp/*.cpp)
add_executable(MyApplication ${MyAppSrc})
target_link_libraries(MyApplication MyLibrary)

Это «почти» работает. Это терпит неудачу во время связи, потому что, в то время как это генерирует libMyLibrary.a - это находится в корне. Когда я добавляю:

link_directories(${MyProj_BINARY_DIR})

без разницы.

У меня есть несколько (взаимосвязанных) вопросов:

  1. Какой лучший способ заставить cmake собрать мою библиотеку и исполняемый файл в «промежуточный каталог» & mdash; скажи MyStage & mdash; держать цели отдельно от источника?
  2. Как мне убедить cmake связать приложение с библиотекой?
  3. Если я хотел создать отладочную и выпускную версию, каков лучший способ расширить мои сценарии cmake для этого & mdash; убедиться, что приложение отладки связано с библиотекой отладки, а приложение выпуска с библиотекой выпуска?

Я относительный новичок в cmake. Я прочитал, что я могу найти в Интернете, но мне не удается связать мою библиотеку с моим исполняемым файлом. Такая конфигурация, на мой взгляд, должна быть довольно распространенной. Был бы очень полезен пример, по которому можно было бы колыбели, но я его не нашел.

Ответы [ 4 ]

23 голосов
/ 25 октября 2011

Что ж, лучше прочитать этот пример и сделать точно так, как предлагается.

cmake_minimum_required (VERSION 2.6)
project (MyProj CXX)
add_subdirectory(MyLib)
add_subdirectory(MyApp)

Затем для каждого указанного подкаталога создаются файлы CMakeLists.txt

MyLib \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp)
add_library(MyLib ${SRC_FILES})

MyApp \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp)
add_executable(MyApp ${SRC_FILES})
target_link_libraries(MyApp MyLib) 
4 голосов
/ 19 октября 2011

Я нашел «оптимальное» решение для (1) ... итак, подумал, что я должен опубликовать это здесь:

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage)

То, что меня смущало ранее, это то, что статические библиотеки не рассматриваютсяБИБЛИОТЕКА Cmake - они считаются АРХИВЫ.

4 голосов
/ 19 октября 2011
  1. Используйте "из исходной сборки". Создайте каталог, используемый только для сборки, и, находясь в нем, позвоните

    cmake <path to the sources, it may be relative>
  2. Либо использовать

    link_directories(${MyProj_BINARY_DIR}/MyLib)

    или создайте CMakeLists.txt в каждом подкаталоге - это было бы лучше для проекта, который больше, чем очень маленький.

  3. Это немного сложно, проверьте CMAKE_BUILD_TYPE в документации (вы можете установить его и / или "если" по нему). Вы также можете установить его из командной строки:

    cmake -DCMAKE_BUILD_TYPE=Debug
0 голосов
/ 08 мая 2018

Не добавляйте библиотеки и исполняемые файлы в корневой каталог Cmakelists.txt. Добавьте эти библиотеки и исполняемые файлы в Cmakelists.txt подкаталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...