如何使用CMake正确链接外部库?

4
我正在尝试使用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/目录中。 - Shravan40
我该如何更改CMakeList.txt以反映这一点? - JustAnotherStudentDev
2
假设您有一个文件/users/Adam/Desktop/chilkat/include/CkRsa.h,这应该可以工作。 - Tsyvarev
2个回答

1
将您的代码更改为以下内容(引号):
include_directories("/users/Adam/Desktop/chilkat/include")
link_directories("/users/Adam/Desktop/chilkat/libDyn")

刚刚做了这个,仍然没有正确包含CkRsa.h文件。 - JustAnotherStudentDev
将头文件和库目录复制到您的目录(您的访问权限),并尝试使用相对路径,例如include_directories(“../ chilkat / include”)等。 - sailfish009
这个目录是 /usr 吗?不确定应该放在哪里。 - JustAnotherStudentDev
/home/JustAnotherStudentDev 注意要使用 chmod 755 命令 - sailfish009
我在一个OS X环境中,我没有这个文件夹。 - JustAnotherStudentDev
然后将该目录复制到您的项目目录中,并包含目录"./chilkat/include"。 - sailfish009

1
我认为这只是您调用顺序的简单问题。CMake按顺序解析其脚本。因此,必须在add_executable()调用之前放置include_directories()调用:
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:创建可重定位软件包

参考资料


我更新了CMakeLists.txt以反映这一点,但它仍然无法正常工作。是否有任何遗漏或不合适的地方?我在问题中进行了更新。 - JustAnotherStudentDev
@JustAnotherStudentDev find_file(_header_path "CkRsa.h" PATHS "/users/Adam/Desktop/chilkat/include")|message("_header_path = ${_header_path}") 这段代码返回什么?你能否在回答中附上编译器的错误信息? - Florian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接