【问题标题】:How to correctly link an external library using CMake?如何使用 CMake 正确链接外部库?
【发布时间】:2017-03-29 06:31:59
【问题描述】:

我正在尝试使用 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;
}

【问题讨论】:

  • 应该在/usr/include/目录下。
  • 如何更改 CMakeList.txt 以反映这一点?
  • 假设你有一个文件 /users/Adam/Desktop/chilkat/include/CkRsa.h 这应该可以工作。

标签: c++ cmake cryptography rsa chilkat


【解决方案1】:

像这样更改您的代码(引用):

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

【讨论】:

  • 刚刚这样做了,仍然没有正确包含 CkRsa.h 文件
  • 将标头和 lib 目录复制到您的目录中(您的访问权限)。并尝试像 include_directories("../chilkat/include") 等相对路径。
  • 这个目录是 /usr 吗?不知道这些应该去哪里
  • /home/JustAnotherStudentDev 注意 chmod 755
  • 我在 OS X 环境中,我没有这个文件夹
【解决方案2】:

我认为这只是您如何订购电话的简单问题。 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: Creating Relocatable Packages

参考文献

【讨论】:

  • 我更新了 CMakeLists.txt 以反映这一点,但它仍然无法正常工作。有什么东西似乎缺失或不合适吗?我在问题中更新了它
  • @JustAnotherStudentDev find_file(_header_path "CkRsa.h" PATHS "/users/Adam/Desktop/chilkat/include")|message("_header_path = ${_header_path}") 返回什么?您能否还将编译器中的错误消息添加到您的答案中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多