/ usr / bin / ld: неопределенная ссылка на библиотеку stati c - PullRequest
1 голос
/ 29 мая 2020

У меня есть следующий файл 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

Я немного искал в inte rnet, и в нескольких местах он сказал, что это происходит из-за отсутствия файлов .so (здесь могу ошибаться). Однако библиотека создает файл .a, которого должно быть достаточно.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Это связано с тем, как построена библиотека bls. Класс bls::PrivateKey реализован в файле , который является частью библиотеки blstmp stati c.

Вы можете напрямую связать blstmp библиотека вместо bls. Это работает: ваша программа работает нормально. Но это немного взломано.

Это происходит из-за проблемы с CMake: когда вы создаете библиотеку A, которая зависит от c библиотеки B, файлы объектов библиотеки B не копируются в библиотеку A. Итак, ваша программа, которая связывает к A также должен быть связан с B. В списке рассылки CMake есть обсуждение .

Но это проблема с библиотекой bls, было бы полезно сообщить об этом сопровождающий.

0 голосов
/ 29 мая 2020

Как указал другой пользователь в ответах, я пошел за сопровождающими библиотеки.

Основная проблема заключалась в том, что они: а) Запускали сильно модифицированную версию reli c. б) Распределите его по 2 папкам.

Решение:

a) Как указал Антуан, включая blstmp вместо bls b) Включая relic_s вместо relic c) Включая reli c из правильных каталогов.

INCLUDE_DIRECTORIES(../../Documents/projects/bls-signatures/src)
LINK_DIRECTORIES(../../Documents/projects/bls-signatures/build/src)

LINK_DIRECTORIES(../../Documents/projects/bls-signatures/build/contrib/relic/lib)
INCLUDE_DIRECTORIES(../../Documents/projects/bls-signatures/build/contrib/relic/include)
INCLUDE_DIRECTORIES(../../Documents/projects/bls-signatures/contrib/relic/include)

add_executable(blsbench2 ${SOURCE_FILES})

TARGET_LINK_LIBRARIES(blsbench2 blstmp relic_s)
...