Как правильно связать внешнюю библиотеку с помощью 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;
}

2

Решение

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

include_directories("/users/Adam/Desktop/chilkat/include")
link_directories("/users/Adam/Desktop/chilkat/libDyn")
0

Другие решения

Я думаю, что это просто проблема того, как вы заказали свои звонки. 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: создание перемещаемых пакетов.

Рекомендации

0

По вопросам рекламы [email protected]