Редко пользуюсь 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;
}
Как избавится от ошибки?
Структура каталогов в каталоге сборки по умолчанию соответствует структуре каталогов исходников. В вашем случае корневой бинарник из проекта 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 имеет значение.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Задачка, видимо, олимпиадная, на рекурсиюСобственно, надо пройти всю доску конем так, чтобы на каждой его клетке конь был только 1 раз
В каких случаях использовать данный синтаксис? Где использовать const, а где ссылку?
Доброго времени сутокИзучая dll, получил интересное задание - сделать библиотеку, работающую с std::string и сделать 2 exe, юзающих dll, одна из которых...