0

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.

hetelek
  • 3,776
  • 5
  • 35
  • 56

1 Answers1

4

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.

Mehrwolf
  • 8,208
  • 2
  • 26
  • 38
  • Changing how I define my LIBS didn't help unfortunately :( – hetelek Aug 17 '12 at 15:08
  • When you added `BigInt`, did you also use it? For example, try to add two `BigInt`s Otherwise the compiler might just optimize it away. I'm also curious, if you used the same compiler for Botan and your program. – Mehrwolf Aug 17 '12 at 16:34
  • Yes, I did actually use it and it was fine. – hetelek Aug 17 '12 at 20:15
  • 2
    Can you try to use Botan together with the header that ships with QtCreator? Might be that you run into problems, when the .cpp is from the Creator but the .h from their website. – Mehrwolf Aug 18 '12 at 06:54