2015-03-16 7 views
0

У меня следующая ситуация: проект A зависит от проекта B, но оба они построены в одно и то же время. Проект A должен включать в себя включение проекта B, и ему также необходимо связать свои библиотеки. До сих пор я пытался так:Конфигурация CMakeLists для связывания двух проектов на C++

ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/other_project other_project) 

, а затем:

INCLUDE_DIRECTORIES(includ ${CMAKE_SOURCE_DIR}/other_project/include}) 
LIST(APPEND LINK_LIBS other_project) 

в CMakeLists.txt Проекта А , но это, кажется, не работает, компилятор также дает мне при включении заголовков проекта B, говорящих, что их не существует.

Каков правильный способ добавления зависимостей в A? Как должен выглядеть CMakeLists.txt?

EDIT:

как предложено в комментариях, этот вопрос был рассмотрен в this, однако я хотел бы увидеть пример того, как использовать его в файле CMakeList.txt.

+0

Возможный дубликат [Вложение одного проекта cmake внутри другого?] (Http://stackoverflow.com/questions/1457920/embedding-one-cmake-project-inside-of-another) – aruisdante

ответ

1

Ниже приведен простой пример, который строит zlib, а затем создает libxml2, который зависит от zlib, который мы создаем. Одно замечание, я быстро вытащил этот пример из того, что я делал раньше. В примере libxml2 используется make, поэтому будет фактически строиться только на системе, которая имеет его, например. Linux, Mac ...

Вот предлагаемая структура каталогов для этого примера ...

  • SRC/
    - CMakeLists.txt
    • CMake/
      ---- External_ZLib.cmake
      ---- External_libxml2.cmake
    • Dowloads/(нет необходимости создавать этот каталог, CMake сделает это за вас)
  • сборки/(из исходной сборки для предотвращения захламления исходного дерева)

файлов:
CMakeLists.txt

# Any version that supports ExternalProject should do 
cmake_minimum_required(VERSION 3.1) 

project(test_ext_proj) 

set(test_ext_proj_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/CMake") 
set(CMAKE_MODULE_PATH ${test_ext_proj_CMAKE_DIR} ${CMAKE_MODULE_PATH}) 

set(test_ext_proj_BUILD_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install) 

set(test_ext_proj_DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Downloads CACHE PATH "Directory to store downloaded tarballs.") 

include(ExternalProject) 
include(External_ZLib) 
include(External_libxml2) 

External_ZLib.cmake:

set(ZLib_version 1.2.8) 
set(ZLib_url "http://zlib.net/zlib-${ZLib_version}.tar.gz") 
set(ZLib_md5 "44d667c142d7cda120332623eab69f40") 

ExternalProject_Add(ZLib 
    URL ${ZLib_url} 
    URL_MD5 ${ZLib_md5} 
    PREFIX ${vision-tpl_BUILD_PREFIX} 
    DOWNLOAD_DIR ${test_ext_proj_DOWNLOAD_DIR} 
    INSTALL_DIR ${test_ext_proj_BUILD_INSTALL_PREFIX} 
    CMAKE_GENERATOR ${gen} 
    CMAKE_ARGS 
    -DCMAKE_INSTALL_PREFIX:PATH=${test_ext_proj_BUILD_INSTALL_PREFIX} 
    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} 
    -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} 
) 

#This variable is required so other packages can find it. 
set(ZLIB_ROOT ${test_ext_proj_BUILD_INSTALL_PREFIX} CACHE PATH "" FORCE) 

External_libxml2 .cmake:

set(libxml2_release "2.9") 
set(libxml2_patch_version 0) 
set(libxml2_url "ftp://xmlsoft.org/libxml2/libxml2-sources-${libxml2_release}.${libxml2_patch_version}.tar.gz") 
set(libxml2_md5 "7da7af8f62e111497d5a2b61d01bd811") 

#We need to state that we're dependent on ZLib so build order is correct 
set(_XML2_DEPENDS ZLib) 

#This build requires make, ensure we have it, or error out. 
if(CMAKE_GENERATOR MATCHES ".*Makefiles") 
    set(MAKE_EXECUTABLE "$(MAKE)") 
else() 
    find_program(MAKE_EXECUTABLE make) 
    if(NOT MAKE_EXECUTABLE) 
    message(FATAL_ERROR "Could not find 'make', required to build libxml2.") 
    endif() 
endif() 

ExternalProject_Add(libxml2 
    DEPENDS ${_XML2_DEPENDS} 
    URL ${libxml2_url} 
    URL_MD5 ${libxml2_md5} 
    PREFIX ${test_ext_proj_BUILD_PREFIX} 
    DOWNLOAD_DIR ${test_ext_proj_DOWNLOAD_DIR} 
    INSTALL_DIR ${test_ext_proj_BUILD_INSTALL_PREFIX} 
    BUILD_IN_SOURCE 1 
    CONFIGURE_COMMAND ./configure 
    --prefix=${test_ext_proj_BUILD_INSTALL_PREFIX} 
    --with-zlib=${ZLIB_ROOT} 
    BUILD_COMMAND ${MAKE_EXECUTABLE} 
    INSTALL_COMMAND ${MAKE_EXECUTABLE} install 
) 
+0

Спасибо, но я не знаю, t нужно загрузить внешний проект. Оба проекта A и B находятся в локальном каталоге, мне просто нужен проект B, который должен быть создан до проекта A и правильно добавить в проект A зависимость от проекта B, а также включенные каталоги – gcswoosh

+1

Я представил пример External_Project, чтобы показать вам структуру/настройка 2 зависимых проектов с использованием CMake (ваш вопрос). Вы должны иметь возможность изменить то, что вам нужно, чтобы использовать локальный проект, это действительно то же самое. Документация покажет вам, что вам нужно отсюда, это неплохо. http: //www.cmake.org/cmake/help/v3.0/module/ExternalProject.html – StAlphonzo

+0

Хорошо, спасибо большое! – gcswoosh