2016-02-22 3 views
0

У меня вопрос о конфигурации проекта cmake.Проект настройки CMake

Ниже представлена ​​моя структура проекта.

trunk 
    | 
    |---- mylib 
    |  | 
    |  ---- mylib.h 
    |  ---- mylib.c 
    |  ---- *MYLIB_CMakeList.txt* 
    | 
    |---- alib 
    |  | 
    |  ---- alib.h 
    |  ---- alibName.lib 
    |  ---- *ALIB_CMakeList.txt* 
    | 
    | 
    |---- main 
    |  | 
    |  ---- main.cpp 
    |  ---- *MAIN_CMakeList.txt* 
    |  
     ---- *TOP_CMakeList.txt* 

MyLib подпапка содержит исходный код (с), чтобы создать свою собственную статическую библиотеку. Этот код зависит от alib.

Основная вложенная папка содержит пример кода (C++), который использует MyLib.

Вот как я написал мой CMakeList файлы:

**TOP_CMakeList.txt** 
cmake_minimum_required(VERSION 3.4) 

add_subdirectory(mylib) 
add_subdirectory(alib) 
add_subdirectory(main) 

------------------------------------------------------------------------------------------------------------ 

**MYLIB_CMakeList.txt** 
cmake_minimum_required(VERSION 3.4) 
project(MyLib C) 

if (WIN32) 
    set(CMAKE_SHARED_LIBRARY_PREFIX "") 
endif() 

include_directories(${alib_INCLUDE_DIRS}) 

add_library(${PROJECT_NAME} STATIC mylib.c) 

target_link_libraries(${PROJECT_NAME} alib) 

set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) 
set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) 

------------------------------------------------------------------------------------------------------------ 

**ALIB_CMakeList.txt** 
cmake_minimum_required(VERSION 3.4) 
project(ALib) 


set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) 
set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) 

------------------------------------------------------------------------------------------------------------ 


**MAIN_CMakeList** 

make_minimum_required(VERSION 3.4) 

project(Executable CPP) 

file(GLOB CPP_FILES *.cpp) 

add_definitions(${MyLib_DEFINITIONS}) 

include_directories(${MyLib_INCLUDE_DIRS}) 

add_executable(${PROJECT_NAME} ${CPP_FILES}) 

target_link_libraries(${PROJECT_NAME} MyLib) 

При такой конфигурации он не распознает Alıb зависимости MyLib. В частности (я разрабатываю под Windows), я получаю эту ошибку:

/usr/lib/gcc/x86_64-pc-cygwin/4.9.3/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lalibName.lib

Я не могу понять, как правильно это сделать. Какие-либо предложения?

+0

"[I] t не работает", к сожалению, не очень хорошее описание проблемы. Не могли бы вы рассказать о том, как это не работает? Строит ли он неправильный порядок? Ошибки запуска CMake? Что-то еще полностью? –

ответ

0

Кажется, что проект alib не определяет какой-либо библиотеки целей точно так же, как MyLib делает:

Попробуйте добавить это CMake alibs' файл

add_library(${PROJECT_NAME} STATIC <<< alib SOURCES HERE >>>) 
+0

Спасибо fritzone, но проект alib состоит только из файла .lib и файла .h. У меня нет исходного кода – cq5beginner

+1

@ cq5beginner, в этом случае вам не нужен файл CMake. Просто используйте 'link_directories' (https://cmake.org/cmake/help/v3.0/command/link_directories.html) и' target_link_libraries' (https://cmake.org/cmake/help/v3.0/command /target_link_libraries.html) для вашего mylib и указать каталог, в котором находится .lib-файл – fritzone

+0

Я попытался, но я получаю эту ошибку 'Нет правила, чтобы сделать цель .... необходимой ...' во время строительства – cq5beginner

0

Статические библиотеки не могут иметь зависимостей (ну, они могут, но они не тащит их с собой), поэтому нет смысла предоставлять alib в target_link_libraries(...) для другой статической библиотеки. Вы должны предоставить alib команде add_execuable напрямую.

В качестве альтернативы вы можете построить большую статическую библиотеку как с mylib, так и с alib, но она будет менее изящной и зависящей от размера. Для gcc вы должны посмотреть на инструмент ar.


Удалить команду add_subdirectory(alib), а затем удалить CMake файл из Alıb вложенной - не нужно. Затем в файле cmake, где у вас есть команда add_executable, введите следующее (после строки);

link_directories(../alib) 
target_link_libraries(${PROJECT_NAME} alibName.lib) 
+0

спасибо за ваш ответ , Я все еще получаю правило «Нет правил» для создания цели aLibName.lib, необходимой для main/Main.exe' – cq5beginner

+0

@ cq5beginner, обновил ответ – ixSci

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