【发布时间】:2020-05-29 08:46:52
【问题描述】:
我得到了以下 cmake 文件:
cmake_minimum_required(VERSION 3.17)
project(blsbench2)
set(CMAKE_CXX_STANDARD 14)
set(SOURCE_FILES main.cpp)
INCLUDE_DIRECTORIES(../../Documents/projects/bls-signatures/src)
LINK_DIRECTORIES(../../Documents/projects/bls-signatures/build/src)
LINK_DIRECTORIES(../../Documents/projects/bls-signatures/build/object_blstmp)
INCLUDE_DIRECTORIES(/usr/local/include/relic/)
LINK_DIRECTORIES(/usr/local/lib/)
add_executable(blsbench2 ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(blsbench2 bls relic)
还有下面的程序
#include <iostream>
#include <bls.hpp>
using namespace bls;
using namespace std;
int main()
{
std::cout << "Hello, World!" << std::endl;
uint8_t seed[] = {0, 50, 6, 244, 24, 199, 1, 25, 52, 88, 192,
19, 18, 12, 89, 6, 220, 18, 102, 58, 209,
82, 12, 62, 89, 110, 182, 9, 44, 20, 254, 22};
PrivateKey sk = PrivateKey::FromSeed(seed, sizeof(seed));
PublicKey pk = sk.GetPublicKey();
uint8_t msg[] = {100, 2, 254, 88, 90, 45, 23};
Signature sig = sk.Sign(msg, sizeof(msg));
return 0;
}
我正在使用 CLion,上面的设置允许我包含库并使用函数自动完成。
当我尝试开始运行程序时出现问题。
/usr/bin/ld: CMakeFiles/blsbench2.dir/main.cpp.o: in function `main':
/home/ray/CLionProjects/blsbench2/main.cpp:16: undefined reference to `bls::PrivateKey::FromSeed(unsigned char const*, unsigned long)'
/usr/bin/ld: /home/ray/CLionProjects/blsbench2/main.cpp:17: undefined reference to `bls::PrivateKey::GetPublicKey() const'
/usr/bin/ld: /home/ray/CLionProjects/blsbench2/main.cpp:21: undefined reference to `bls::PrivateKey::Sign(unsigned char const*, unsigned long) const'
/usr/bin/ld: /home/ray/CLionProjects/blsbench2/main.cpp:16: undefined reference to `bls::PrivateKey::~PrivateKey()'
/usr/bin/ld: /home/ray/CLionProjects/blsbench2/main.cpp:16: undefined reference to `bls::PrivateKey::~PrivateKey()'
/usr/bin/ld: CMakeFiles/blsbench2.dir/main.cpp.o: in function `bls::Signature::~Signature()':
/home/ray/CLionProjects/blsbench2/../../Documents/projects/bls-signatures/src/signature.hpp:101: undefined reference to `bls::AggregationInfo::~AggregationInfo()'
collect2: error: ld returned 1 exit status
我在互联网上搜索了一下,它在几个地方说这是由于缺少 .so 文件(可能在这里弄错了)。但是,该库构建一个 .a 文件就足够了。
【问题讨论】:
-
看起来
bls库实际上并没有定义给定的符号(构造函数、析构函数、方法)。您可以使用nm <path-to-library-file> --demangle获取静态库中定义的符号列表(方法取自这里:stackoverflow.com/a/2714330/3440745)。bls-signatures项目手动创建bls库:src/CMakeLists.txt,这种方法可能有问题。