我以为我已经弄明白了这一点,但我最近旋转了一个新的服务器,让我的代码运行,我不能让它建立在新的服务器上。在我的开发笔记本电脑(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/
我不认为复制命令是必要的,但由于这是文件位于我的开发笔记本电脑,我认为这是值得一试。
1条答案
按热度按时间wnvonmuf1#
它不需要同时定义一个导入库和
find_package
。https://learn.microsoft.com/en-us/vcpkg/users/buildsystems/cmake-integration#using-libraries 说:
当安装具有特定CMake支持的库时,vcpkg将显示有关如何使用库的使用信息
对于cryptopp,vcpkg说要执行以下操作:
非vcpkg相关信息(如果这个问题与vcpkg无关,我会说什么):
忽略你写的
find_package
部分,您的目标名为
llibcryptopp
。我假设您的意思是在target_link _libraries
中传递目标名称?即target_link_libraries(untitled llibcryptopp)
。我假设“llib”是一个错字,你实际上是指“lib”。没有必要在CMake中的库目标名称前加上“lib”前缀。事实上,这是适得其反的,因为CMake会在常规平台上自动将“lib”前缀添加到目标的输出文件名中(参见
CMAKE_SHARED_LIBRARY_PREFIX
和CMAKE_STATIC_LIBRARY_PREFIX
)。如果您预先使用“lib”作为前缀,您将得到一个前缀为“liblib”的输出文件。我建议你将目标命名为
cryptopp
,然后执行target_link_libraries(untitled cryptopp)
。您可以在参考文档中阅读
target_link_libraries
的工作原理。每个项参数都可以是库目标名称、库文件的完整路径、普通库名称、链接标志或生成器表达式。当库是同一CMake配置中的目标时,您应该使用库目标名称形式。