Trouble using Botan with Qt

3k Views Asked by At

I am using Qt and I am trying to use Botan. Everything seemed to go well, but when I go:

Botan::BigInt myInt;

In my constructor it works fine, but on the other hand if I go:

Botan::AutoSeeded_RNG rng;

It throws undefined errors:

C:\Users\Stevie\Desktop\asfsdf-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\debug\mainwindow.o:-1: In function `AutoSeeded_RNG':
C:\Users\Stevie\Desktop\asfsdf-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\..\..\..\..\botan\include\botan\auto_rng.h:40: error: undefined reference to `_imp___ZN5Botan23Global_State_Management12global_stateEv'
C:\Users\Stevie\Desktop\asfsdf-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\..\..\..\..\botan\include\botan\auto_rng.h:40: error: undefined reference to `_imp___ZN5Botan13Library_State10global_rngEv'
:-1: error: collect2: ld returned 1 exit status

I have no idea why it would work with a BigInt but not the AutoSeeded_RNG, but here are my exact steps:

  1. Compiled the Botan source included in the Qt Creator source at "src/libs/3rdparty/botan/"

  2. I installed Botan using the Windows Installer (1.10) from their website.

  3. I took the libBotan.a, libBotand.a, botan.dll, and Botand.dll and put them in the location where I installed Botan (C:\botan). I overwrote any of those files that already existed.

  4. I then created a new Qt project, and inside of the .pro file I added the following lines:

    INCLUDEPATH += "C:/botan/include"
    LIBS += "C:/botan/libBotan.a"

  5. Next, I go into my "mainwindow.cpp", and add:

    #include <botan/botan.h>

    Everything compiles up to here successfully.

  6. I now add this to my constructor:

    Botan::AutoSeeded_RNG rng;

Now the above errors are thrown, and cannot be ran. If I replace the "AutoSeeded_RNG" with "BigInt", then it compiles perfectly.

Thanks for any help, Hetelek.

1

There are 1 best solutions below

4
On

The statement to link against the Botan library looks strange to me. Normally, you specify library directories using the -L switch and add a library with the -l switch, i.e you should use

LIBS += -L"C:\botan" -lBotan

Note that the prefix and suffix of the library are not specified in lbotan. The linker will automatically look for a libbotan.a or botan.dll, depending on your environment.

Botan is also part of QtCreator. Maybe you should have a look at their repository. You can find .pri and .pro files there and probably only need to copy them. They also have written a .qbs driver for the new Qt build system.

Edit: I just compiled Botan from the QtCreator sources, as you also mentioned in your post. I then copied all the generated libraries in my own directory and I also used the botan.h which was shipped with QtCreator. On Linux I had to add

LIBS += -L"/dir/into/which/i/copied/botan/dlls" -LBotan -ldl

to the qmake .pro file. Note the additional -ldl otherwise I got undefined references to dlym, dlerror etc. I could compile a simple example with Botan::AutoSeeded_RNG without problems.