c++ 如何使用CMake正确链接到使用vcpkg安装的cryptopp?

j0pj023g  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(245)

我以为我已经弄明白了这一点,但我最近旋转了一个新的服务器,让我的代码运行,我不能让它建立在新的服务器上。在我的开发笔记本电脑(Ubuntu 22)上的IDE上,一切都运行得很好。这里有一个简单的例子来说明我在做什么。
CMakeLists.txt

cmake_minimum_required(VERSION 3.22)
project(untitled)

set(CMAKE_CXX_STANDARD 17)

add_library(llibcryptopp STATIC IMPORTED)

find_package(cryptopp)

add_executable(untitled main.cpp)

target_link_libraries(untitled cryptopp)

main.cpp

#include <iostream>

#include <cryptopp870/sha.h>
#include <cryptopp870/ripemd.h>
#include <iomanip>

int main() {
    std::cout << "Hello, World!" << std::endl;

    unsigned char input[]="test";

    //do sha256
    CryptoPP::byte abDigest[CryptoPP::SHA256::DIGESTSIZE];
    CryptoPP::SHA256().CalculateDigest(abDigest, input, 4);

    //do ripemd160
    CryptoPP::byte abDigest2[CryptoPP::RIPEMD160::DIGESTSIZE];
    CryptoPP::RIPEMD160().CalculateDigest(abDigest2,abDigest,CryptoPP::SHA256::DIGESTSIZE);

    //print
    for (size_t i=0;i<CryptoPP::RIPEMD160::DIGESTSIZE;i++) {
        std::cout << std::hex << std::setw(2) << std::setfill('0') << (unsigned)abDigest2[i];
    }

    std::cout << std::endl;

    //should output:
    //Hello, World!
    //cebaa98c19807134434d107b0d3e5692a516ea66

    return 0;
}

在我的IDE上,它执行并打印正确的哈希。在新服务器上,当我尝试构建时,我得到:

mkdir build
cd build/
cmake -B . -S .. -DCMAKE_TOOLCHAIN_FILE=/opt/vcpkg/scripts/buildsystems/vcpkg.cmake

-- The C compiler identification is GNU 11.3.0
-- The CXX compiler identification is GNU 11.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mctrivia/untitled/build

cmake --build .

[ 50%] Building CXX object CMakeFiles/untitled.dir/main.cpp.o
[100%] Linking CXX executable untitled
/usr/bin/ld: cannot find -lcryptopp: No such file or directory
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/untitled.dir/build.make:97: untitled] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/untitled.dir/all] Error 2
gmake: *** [Makefile:91: all] Error 2

我安装了cryptopp使用

sudo vcpkg install cryptopp
sudo cp /opt/vcpkg/packages/cryptopp_x64-linux/lib/libcryptopp.a /usr/bin/
sudo mkdir /usr/local/include/cryptopp870
sudo cp /opt/vcpkg/packages/cryptopp_x64-linux/include/cryptopp/* /usr/local/include/cryptopp870/

我不认为复制命令是必要的,但由于这是文件位于我的开发笔记本电脑,我认为这是值得一试。

wnvonmuf

wnvonmuf1#

它不需要同时定义一个导入库和find_package
https://learn.microsoft.com/en-us/vcpkg/users/buildsystems/cmake-integration#using-libraries 说:
当安装具有特定CMake支持的库时,vcpkg将显示有关如何使用库的使用信息
对于cryptopp,vcpkg说要执行以下操作:

find_package(cryptopp CONFIG REQUIRED)
target_link_libraries(main PRIVATE cryptopp::cryptopp)

非vcpkg相关信息(如果这个问题与vcpkg无关,我会说什么):
忽略你写的find_package部分,
您的目标名为llibcryptopp。我假设您的意思是在target_link _libraries中传递目标名称?即target_link_libraries(untitled llibcryptopp)。我假设“llib”是一个错字,你实际上是指“lib”。
没有必要在CMake中的库目标名称前加上“lib”前缀。事实上,这是适得其反的,因为CMake会在常规平台上自动将“lib”前缀添加到目标的输出文件名中(参见CMAKE_SHARED_LIBRARY_PREFIXCMAKE_STATIC_LIBRARY_PREFIX)。如果您预先使用“lib”作为前缀,您将得到一个前缀为“liblib”的输出文件。
我建议你将目标命名为cryptopp,然后执行target_link_libraries(untitled cryptopp)
您可以在参考文档中阅读target_link_libraries的工作原理。每个项参数都可以是库目标名称、库文件的完整路径、普通库名称、链接标志或生成器表达式。当库是同一CMake配置中的目标时,您应该使用库目标名称形式。

相关问题