Как подключить либу к своему проекту?

359
15 июня 2017, 06:43

Редко пользуюсь CMake. Вроде всё просто. Но тут вдруг вылезла ошибка, с которой не могу справиться:

CMake Error at CMakeLists.txt:6 (add_subdirectory):
add_subdirectory not given a binary directory but the given source
directory "C:/projects/cmake/foo/src" is not a subdirectory of
"C:/projects/cmake/app/src". When specifying an out-of-tree source a
binary directory must be explicitly specified.

Библиотека foo лежит в той же папке, что и приложение app. Ошибка исчезает, если поместить библиотеку внутрь app/src. Структура каталогов такая:

|-- app/src
|-- foo/src

В папке app/src лежат файлы

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 
project(hello_world)                
set(SOURCE_EXE main.cpp)
include_directories(../../foo/src)
add_executable(main ${SOURCE_EXE})
add_subdirectory(../../foo/src)
target_link_libraries(main foo)

main.cpp:

#include "foo.h"
int main(int argc, char** argv)
{
  hello_world();
  return 0;
}

В папке foo/src лежат файлы

CMakeLists.cpp:

cmake_minimum_required(VERSION 2.8)
project(foo)                
set(SOURCE_LIB foo.cpp)     
add_library(foo STATIC ${SOURCE_LIB})

foo.h:

void hello_world();

foo.cpp:

#include <iostream>
void hello_world()
{
  std::cout << "Hello, World!" << std::endl;
}

Как избавится от ошибки?

Answer 1

Структура каталогов в каталоге сборки по умолчанию соответствует структуре каталогов исходников. В вашем случае корневой бинарник из проекта app будет лежать в корне каталога сборки, а foo тогда должен лежать в соседнем каталоге, но тогда он будет располагаться за пределами каталога сборки. Обычно проблема решается так: есть конечный проект (библиотека или приложение), который подключает зависимости при помощи target_link_libraries, и есть корневой проект, в котором уже указывается, где искать зависимости. При этом для изменения путей к либам не нужно модифицировать CMakeLists основного проекта. Структура должна быть примерно такая:

project
|- CMakeLists #1
|- src
|- |- CMakeLists #2
|- libs
|- |- CMakeLists #3

Сборка должна запускаться для CMakeLists #1. В CMakeLists #1 сначала идет поиск библиотек, затем add_subdirectory(src). Библиотеки можно прописывать либо напрямую в CMakeLists #1, либо можно добавить дочерний проект с библиотеками при помощи add_subdirectory(libs), и прописывать пути к либам в CMakeLists #3.

Только нужно помнить, что порядок в CMake имеет значение.

READ ALSO
вопрос по QTimer

вопрос по QTimer

здравствуйте, интересует пара вопросов по QTimer тк

384
Обход доски конем

Обход доски конем

Задачка, видимо, олимпиадная, на рекурсиюСобственно, надо пройти всю доску конем так, чтобы на каждой его клетке конь был только 1 раз

302
C++11 range-based цикл

C++11 range-based цикл

В каких случаях использовать данный синтаксис? Где использовать const, а где ссылку?

305
Использование std::string в dll

Использование std::string в dll

Доброго времени сутокИзучая dll, получил интересное задание - сделать библиотеку, работающую с std::string и сделать 2 exe, юзающих dll, одна из которых...

202