herumi / bls

288 stars 132 forks source link

Can't link to libbls384_256.a with a simple sample code #84

Closed mxaddict closed 2 years ago

mxaddict commented 2 years ago

sample that I'm trying to run:

#include <bls/bls384_256.h>
#include <bls/bls.h>
#include <iostream>
#include <vector>

int main()
{
    blsInit(5, MCLBN_COMPILED_TIME_VAR);

    mclBnG1 g1;
    mclBnG1_getBasePoint(&g1);

    std::vector<unsigned char> ba(48);
    int baLen = mclBnG1_serialize(&ba[0], 48, &g1);

    assert(baLen == 48);

    exit(-1);
}

compiling with the following command:

g++ -I../include -I../mcl/include temp.cpp libbls384_256.a

bls was built using the included Makefile via

make -j24

Getting this linker error:

/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FrTag, 256ul>::setArrayMask<char>(char const*, unsigned long)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:378: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FrTag, 256ul>::setArray<unsigned char>(bool*, unsigned char const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FrTag, 256ul>::setArray<char>(bool*, char const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FrTag, 256ul>::setArrayMask<unsigned long>(unsigned long const*, unsigned long)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:378: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FpTag, 384ul>::setArrayMask<unsigned long>(unsigned long const*, unsigned long)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:378: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o):/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:378: more undefined references to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)' follow
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `mcl::MapTo_WB19<mcl::FpT<mcl::bn::local::FpTag, 384ul>, mcl::EcT<mcl::FpT<mcl::bn::local::FpTag, 384ul> >, mcl::Fp2T<mcl::FpT<mcl::bn::local::FpTag, 384ul> >, mcl::EcT<mcl::Fp2T<mcl::FpT<mcl::bn::local::FpTag, 384ul> > > >::hashToFp2(mcl::Fp2T<mcl::FpT<mcl::bn::local::FpTag, 384ul> >*, void const*, unsigned long, void const*, unsigned long) const':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/mapto_wb19.hpp:518: undefined reference to `mcl::fp::expand_message_xmd(unsigned char*, unsigned long, void const*, unsigned long, void const*, unsigned long)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FpTag, 384ul>::setArray<unsigned char>(bool*, unsigned char const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FpTag, 384ul>::setArrayMask<char>(char const*, unsigned long)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:378: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: /home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:378: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: /home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:378: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FrTag, 256ul>::setArray<unsigned long>(bool*, unsigned long const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `mcl::fp::Op::~Op()':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/op.hpp:284: undefined reference to `mcl::fp::Op::destroyFpGenerator(mcl::fp::FpGenerator*)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FpTag, 384ul>::setArray<unsigned char>(bool*, unsigned char const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `mcl::FpT<mcl::bn::local::FrTag, 256ul>::init(bool*, int, mcl::VintT<mcl::vint::Buffer<unsigned long> > const&, mcl::fp::Mode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:137: undefined reference to `mcl::fp::Op::init(mcl::VintT<mcl::vint::Buffer<unsigned long> > const&, unsigned long, int, mcl::fp::Mode, unsigned long)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `mcl::FpT<mcl::bn::local::FpTag, 384ul>::init(bool*, int, mcl::VintT<mcl::vint::Buffer<unsigned long> > const&, mcl::fp::Mode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:137: undefined reference to `mcl::fp::Op::init(mcl::VintT<mcl::vint::Buffer<unsigned long> > const&, unsigned long, int, mcl::fp::Mode, unsigned long)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FpTag, 384ul>::setArray<unsigned char>(bool*, unsigned char const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: /home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FpTag, 384ul>::setArray<unsigned long>(bool*, unsigned long const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: /home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FrTag, 256ul>::setArray<unsigned long>(bool*, unsigned long const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o):/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: more undefined references to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)' follow
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `mcl::MapTo_WB19<mcl::FpT<mcl::bn::local::FpTag, 384ul>, mcl::EcT<mcl::FpT<mcl::bn::local::FpTag, 384ul> >, mcl::Fp2T<mcl::FpT<mcl::bn::local::FpTag, 384ul> >, mcl::EcT<mcl::Fp2T<mcl::FpT<mcl::bn::local::FpTag, 384ul> > > >::msgToG1(mcl::EcT<mcl::FpT<mcl::bn::local::FpTag, 384ul> >&, void const*, unsigned long, char const*, unsigned long) const':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/mapto_wb19.hpp:553: undefined reference to `mcl::fp::expand_message_xmd(unsigned char*, unsigned long, void const*, unsigned long, void const*, unsigned long)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FpTag, 384ul>::setArray<unsigned char>(bool*, unsigned char const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: /home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
/usr/bin/ld: lib/libbls384_256.a(bls_c384_256.o): in function `void mcl::FpT<mcl::bn::local::FrTag, 256ul>::setArray<unsigned long>(bool*, unsigned long const*, unsigned long, mcl::fp::MaskMode)':
/home/mxaddict/Projects/mxaddict/bls/mcl/include/mcl/fp.hpp:350: undefined reference to `mcl::fp::copyAndMask(unsigned long*, void const*, unsigned long, mcl::fp::Op const&, mcl::fp::MaskMode)'
collect2: error: ld returned 1 exit status

This is related to https://github.com/herumi/mcl/issues/140, will close that issue now since I'm trying to link against libbls and not libmcl

mxaddict commented 2 years ago

Building the same code against the *.so seems to work fine:

g++ -Iinclude -Imcl/include temp.cpp build/lib/libbls384_256.so

image

herumi commented 2 years ago

"-L ./mcl/lib -lmcl" options seem to be necessary.

mxaddict commented 2 years ago

"-L ./mcl/lib -lmcl" options seem to be necessary.

I see, I'll give it a try.

mxaddict commented 2 years ago

"-L ./mcl/lib -lmcl" options seem to be necessary.

This worked for me:

g++ -Iinclude -Imcl/include temp.cpp lib/libbls384_256.a mcl/lib/libmcl.a

So libmcl.a is not linked in libbls*.a statically/directly

Is this by design?

mxaddict commented 2 years ago

Thank you for the help @herumi, I will be closing the issue now! Great work on this lib btw!