Как правильно связать внешнюю библиотеку с помощью CMake?

Я пытаюсь использовать библиотеку Chilkat C++ для выполнения задания по криптографии, но не могу заставить библиотеку правильно связать. На данный момент заголовочный файл CkRsa.h не может быть найден компилятором. Я потратил несколько часов на поиск в Интернете решений, но безрезультатно. Вот что у меня есть до сих пор (это все в среде Mac OS X):

Файлы lib устанавливаются в /users/Adam/Desktop/chilkat/libDyn, а файлы заголовков — в /users/Adam/Desktop/chilkat/include Вот мой CMakeLists.txt

cmake_minimum_required(VERSION 3.6)
project(SocketEncryption)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)

add_library(chilkat STATIC IMPORTED)
set_property(
        TARGET chilkat
        PROPERTY
        IMPORTED_LOCATION "/users/Adam/Desktop/chilkat/libDyn/libchilkat_x86_64.dylib"
        INTERFACE_INCLUDE_DIRECTORIES "/users/Adam/Desktop/chilkat/include"
)
add_executable(SocketEncryption ${SOURCE_FILES})

target_link_libraries(SocketEncryption chilkat)

Вот мой main.cpp

#include <iostream>
#include <CkRsa.h>
//#include <CkPrivateKey.h>
//#include <CkSocket.h>

int main() {
    CkRsa alice;
    CkRsa bob;

    // Key Generation
    bool success = alice.GenerateKey(1024);
    const char *alicePublicKey = alice.exportPublicKey();
    const char *alicePrivateKey = alice.exportPrivateKey();
    const char *aliceMessage = "Hi, Bob. How are you?";

    // Encryption Step
    std::cout << "Encryption started." << std::endl;
    CkRsa rsaEncryptor;
    rsaEncryptor.put_EncodingMode("hex");
    success = rsaEncryptor.ImportPublicKey(alicePublicKey);
    bool usePrivateKey = false;
    const char * ciphertext = rsaEncryptor.encryptStringENC(aliceMessage, success);
    std::cout << ciphertext << std::endl;


    return 0;
}

person JustAnotherStudentDev    schedule 29.03.2017    source источник
comment
Он должен находиться в каталоге /usr/include/.   -  person Shravan40    schedule 29.03.2017
comment
Как мне изменить CMakeList.txt, чтобы отразить это?   -  person JustAnotherStudentDev    schedule 29.03.2017
comment
Предполагая, что у вас есть файл /users/Adam/Desktop/chilkat/include/CkRsa.h, это должно работать.   -  person Tsyvarev    schedule 29.03.2017


Ответы (2)


измените свой код следующим образом (цитата):

include_directories("/users/Adam/Desktop/chilkat/include")
link_directories("/users/Adam/Desktop/chilkat/libDyn")
person sailfish009    schedule 29.03.2017
comment
Только что сделал это, все равно не правильно включает файл CkRsa.h - person JustAnotherStudentDev; 29.03.2017
comment
скопируйте заголовок и каталог lib в свой каталог (ваше право доступа). и попробуйте относительный путь, например include_directories(../chilkat/include) и т. д. - person sailfish009; 29.03.2017
comment
будет ли этот каталог /usr ? не уверен, куда они должны идти - person JustAnotherStudentDev; 29.03.2017
comment
/home/JustAnotherStudentDev обратите внимание, что chmod 755 - person sailfish009; 29.03.2017
comment
Я нахожусь в среде OS X, у меня нет этой папки - person JustAnotherStudentDev; 29.03.2017
comment
затем скопируйте каталог в каталог вашего проекта и include_directories(./chilkat/include) - person sailfish009; 29.03.2017

Я думаю, что это просто проблема того, как вы заказывали звонки. CMake анализирует свои сценарии последовательно. Таким образом, вызов include_directories() должен быть помещен перед вызовом add_executable():

include_directories("/users/Adam/Desktop/chilkat/include")
add_executable(SocketEncryption ${SOURCE_FILES})

Лучшим способом, начиная с CMake 2.8.12, было бы позволить библиотеке распространять пути к файлам заголовков:

target_include_directories(chilkat PUBLIC "/users/Adam/Desktop/chilkat/include")

Или — для удобочитаемости — добавьте его напрямую через целевые свойства:

set_property(
    TARGET chilkat 
    PROPERTY 
        IMPORTED_LOCATION "/users/Adam/Desktop/chilkat/libDyn/libchilkat_x86_64.dylib"
        INTERFACE_INCLUDE_DIRECTORIES "/users/Adam/Desktop/chilkat/include"
)

См. также CMake: Создание перемещаемых пакетов< /а>.

Ссылки

person Florian    schedule 29.03.2017
comment
Я обновил CMakeLists.txt, чтобы отразить это, но он по-прежнему работает неправильно. Что-то кажется недостающим или неуместным? я обновил в вопросе - person JustAnotherStudentDev; 29.03.2017
comment
@JustAnotherStudentDev Что возвращает find_file(_header_path "CkRsa.h" PATHS "/users/Adam/Desktop/chilkat/include")|message("_header_path = ${_header_path}")? Не могли бы вы также добавить сообщения об ошибках вашего компилятора в свой ответ? - person Florian; 29.03.2017