Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Прочее > cmake и внешняя либа


Автор: JoeUser 18.07.20, 18:23
Всем привет!

Прошу помощи в конфигурации cmake. Сення первый день вожусь с cmake и сабж не получается! :'(
Делаю тестовый проект, структура его такова:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    C:\Projects\c++\TestSFTP\
     ├─ main.cpp
     ├─ CMakeLists.txt (1)
     └─ sftp++\
         ├─ sftp_auth.cpp
         ├─ sftp_tools.cpp
         ├─ sftp++.cpp
         ├─ sftp_auth.h
         ├─ sftp_defs.h
         ├─ sftp++.h
         └─ CMakeLists.txt (2)

В CMakeLists.txt (1) написал:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    cmake_minimum_required(VERSION 3.5)
    project(TestSFTP LANGUAGES CXX)
     
    set(CMAKE_CXX_STANDARD 17)
     
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
     
    set(SOURCE_EXE main.cpp)
     
    include_directories(sftp++)
     
    add_executable(TestSFTP ${SOURCE_EXE})
     
    add_subdirectory(sftp++)
     
    target_link_libraries(TestSFTP sftp++)

A в CMakeLists.txt (2):

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    cmake_minimum_required(VERSION 3.5)
     
    project(sftp++)
     
    set(SOURCE_LIB
          sftp++.cpp
          sftp_auth.cpp
          sftp_tools.cpp
    )
     
    set(HEADER_LIB
          sftp++.h
          sftp_defs.h
          sftp_auth.h
    )
     
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(BITS x64)
    elseif()
        set(BITS x32)
    endif()
     
    message("Bits ${BITS}")
     
    add_library (sftp++ STATIC ${SOURCE_LIB} ${HEADER_LIB})

Пока все линкуется и собирается. Но мне нужно подключить внешнюю либу libssh2 к моей собираемой sftp++,
а она у меня находится тут для shared:

C:/Projects/c++/libssh2/vs-x64-shared/bin
C:/Projects/c++/libssh2/vs-x64-shared/include
C:/Projects/c++/libssh2/vs-x64-shared/lib

Или тут для static:

C:/Projects/c++/libssh2/vs-x64-static/include
C:/Projects/c++/libssh2/vs-x64-static/lib

Собственно, вопрос

Куда и что прописать, чтобы создаваемая мною либа sftp++ могла использовать libssh2 (статически и динамически)? :wall:

И попутно ... в конфиге я определяю битность, в которую собирается проект.
А можно ли как-то подобным образом определить static/shared и vc/mingw?

Автор: OpenGL 23.07.20, 09:38
Не совсем понятно, в чём вопрос. target_include_directories + target_link_libraries тут почему-то не подходят?
Но вообще обычно сторонние библиотеки подключают через find_package - он найдёт cmake скрипт, проставит нужные переменные и сделает прочие действия, специфические для подключаемой библиотеки.

Добавлено
Кстати
Цитата JoeUser @
В CMakeLists.txt (1) написал:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    include_directories(sftp++)
    target_link_libraries(TestSFTP sftp++)


Гораздо удобнее это делать, объявляя target_include_directories(sftp++ INTERFACE include_path) в cmakelists библиотеки. Тогда при подключении sftp++ в первом файле тебе достаточно будет указать target_link_libraries, а include подтянутся уже автоматом.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)