2015-11-15 2 views
0

Я изучаю CMake, но я стараюсь понять, как связать двоичный файл с общей библиотекой, а затем установить эти файлы в папку выпуска.Cmake Общая библиотека

Это структура моего проекта:

├── CMakeLists.txt 
├── build 
├── main 
│   ├── CMakeLists.txt 
│   └── main.cpp 
├── release 
|_______bin 
│   ├── include 
│   │   └── math.h 
│   └── lib 
│    └── libmathLib.dylib 
└── shared_lib 
    ├── CMakeLists.txt 
    ├── include 
    │   └── math.h 
    └── src 
     └── math.cpp 

В корневой CMakeLists.txt я определил параметры проекта и поддиректорию.

Корень CMakeLists.txt:

cmake_minimum_required(VERSION 3.1) 

project (Math) 
set(CMAKE_BUILD_TYPE Release) 

set(MAKE_INCLUDE_CURRENT_DIR ON) 

ADD_SUBDIRECTORY(shared_lib) 
ADD_SUBDIRECTORY(main) 

Главная CMakeLists.txt:

add_executable(main main.cpp) 
TARGET_LINK_LIBRARIES(main LINK_PUBLIC mathLib) 

Math Lib (общий Lib)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) 

add_library(mathLib SHARED src/math.cpp) 

install(TARGETS mathLib DESTINATION /Users/giuseppe/development/cmake/release/lib LIBRARY NAMELINK_ONLY) 
install(FILES include/math.h DESTINATION /Users/giuseppe/development/cmake/release/include) 

Когда я строю проект с косметическим, его не связывает main.o с общей библиотекой. Ошибка: фаза

Scanning dependencies of target mathLib 
[ 50%] Building CXX object shared_lib/CMakeFiles/mathLib.dir/src/math.cpp.o 
Linking CXX shared library libmathLib.dylib 
[ 50%] Built target mathLib 
Scanning dependencies of target main 
[100%] Building CXX object main/CMakeFiles/main.dir/main.cpp.o 
/Users/giuseppe/development/cmake/main/main.cpp:8:12: error: use of undeclared identifier 'sum' 
    count << sum(5,6) << endl; 
     ^
1 error generated. 
make[2]: *** [main/CMakeFiles/main.dir/main.cpp.o] Error 1 
make[1]: *** [main/CMakeFiles/main.dir/all] Error 2 
make: *** [all] Error 2 

выпуска:

Как я могу убедиться, что создает в папке бен в папке релиза использовать общий LIB в «путь/выпуска/Lib»? Возможно, используя относительный путь, например «../lib/»?

+0

Ваше имя исполняемого файла является 'math', и вы пытаетесь установить ссылку на цель с именем' main'. Это опечатка? – HeyYO

+0

@ HeyYO спасибо, да это опечатка. –

+0

'использование необъявленного идентификатора' является ошибкой компилятора, а не компоновщиком. Существует проблема с вашими включениями. Вы уверены, что 'math.h' находится в вашем пути включения? Я предполагаю, что это файл, который объявляет 'sum()'. – HeyYO

ответ

0

Вы должны добавить каталог include для библиотеки в main/CMakeLists.txt. Дополнить его до shared_lib/CMakeLists.txt недостаточно. Попробуйте эту строку:

include_directories("../shared_lib/include") 
+0

Не следует ли Cmake обрабатывать этот путь автоматически, потому что я устанавливаю 'include_directories ($ {CMAKE_CURRENT_SOURCE_DIR}/include)' в shared_lib/CMakeList.txt? –

+0

Нет. Использование родительского файла 'CMakeList.txt' не объединяет файлы sub CmakeLists.txt вместе. Они все еще являются отдельными проектами. Если вы хотите объявить свои включения один раз, вы можете использовать один файл CMakeList.txt. – HeyYO

+0

Вот что я хотел бы сделать. Например, было бы неплохо объявить, что все включено в верхнем уровне CMakeLists.txt? –

Смежные вопросы