LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Software (https://www.linuxquestions.org/questions/linux-software-2/)
-   -   Unable to compile bitcoin (https://www.linuxquestions.org/questions/linux-software-2/unable-to-compile-bitcoin-891901/)

malloc 07-15-2011 11:44 AM

Unable to compile bitcoin
 
I thought I would try bitcoin but I am unable to compile the latest bitcoin client (bitcoin-0.3.24).

I'm using 32-bit Slackware 13.1.0. When I initially attempted to compile I got errors related to wxWidgets being missing. This was resolved by compiling and installing wxWidgets. However I still get the following error:

Code:

g++ -c -O2 -Wno-invalid-offsetof -Wformat -g -D__WXDEBUG__ -DNOPCH -DFOURWAYSSE2 -DUSE_SSL -DUSE_UPNP=0 -I/usr/local/lib/wx/include/gtk2-unicode-2.9 -I/usr/loal/include/wx-2.9 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -DGUI -o obj/util.o util.cpp
In file included from main.h:11,
                from headers.h:96,
                from util.cpp:4:
db.h: In member function 'bool CDB::Exists(const K&)':
db.h:149: error: 'class Db' has no member named 'exists'
make: *** [obj/util.o] Error 1

I have tried to grep for the class definition of "Db" but I am unable to find it. Where is it? Is this a programming error from the developers of bitcoin, or is this a particular issue at my system?

However, most importantly, if there is a solution for this problem then please tell me.

I also tried simply running the binary that was distributed with the package, but that resulted in the following error:

Code:

./bitcoin: symbol lookup error: ./bitcoin: undefined symbol: gtk_widget_get_realized
On the bitcoin forum I was told the following

Quote:

You might need libdb4.8++-dev or something like it.
I've been trying this for a few hours now. I downloaded libdb4.8-dev_4.8.24-1ubuntu1_i386.deb from http://packages.ubuntu.com/lucid/i38...8-dev/download. Converted it to TGZ with Alien and installed it, then finally ran ldconfig.

The compilation still fails, but the compiler added one new line:

Code:

/usr/include/db_cxx.h:796: error: 'DB_XIDDATASIZE' was not declared in this scope
The full compiler error is:

Code:

g++ -c -O2 -Wno-invalid-offsetof -Wformat -g -D__WXDEBUG__ -DNOPCH -DFOURWAYSSE2 -DUSE_SSL -DUSE_UPNP=0 -I/usr/local/lib/wx/include/gtk2-unicode-2.9 -I/usr/local/include/wx-2.9 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -DGUI -o obj/util.o util.cpp
In file included from headers.h:43,
                from util.cpp:4:
/usr/include/db_cxx.h:796: error: 'DB_XIDDATASIZE' was not declared in this scope
In file included from main.h:11,
                from headers.h:96,
                from util.cpp:4:
db.h: In member function 'bool CDB::Exists(const K&)':
db.h:149: error: 'class Db' has no member named 'exists'
make: *** [obj/util.o] Error 1

Any ideas?

weibullguy 07-15-2011 02:21 PM

Try using Google and searching for the error message. Why won't this work for you --> http://forums.atomicmpc.com.au/index...howtopic=39944 I bet you're having the same problem, older db libraries than the Bitcoin devs are building against. The other option is to use an earlier version of Bitcoin.

Also, I'm not a Slackware user, but I believe Slackware installs the headers and static libs rather than splitting them out into a -dev package. You should reinstall the Slackware db package and not install Ubuntu cruft or you will very likely have a borked system in no time. I'd fix that before I worried about building Bitcoin.

malloc 07-16-2011 02:53 PM

Quote:

Originally Posted by weibullguy (Post 4415942)
Try using Google and searching for the error message. Why won't this work for you --> http://forums.atomicmpc.com.au/index...howtopic=39944 I bet you're having the same problem, older db libraries than the Bitcoin devs are building against. The other option is to use an earlier version of Bitcoin.

Also, I'm not a Slackware user, but I believe Slackware installs the headers and static libs rather than splitting them out into a -dev package. You should reinstall the Slackware db package and not install Ubuntu cruft or you will very likely have a borked system in no time. I'd fix that before I worried about building Bitcoin.

Thanks.

I might be making some progress here, I'm not sure.

I've been trying to follow the guide at (the PDF file) http://forums.atomicmpc.com.au/index...howtopic=39944
I installed all of the dependencies and then tried to use the Makefile presented in the document. This however only resulted in errors from make -- not errors from the compiler. With an unspecified rule.

I was unable to modify the Makefile trivially so I made more than just a few modifications, this is my Makefile for bitcoin now:

Code:

DEPSDIR=/tmp/bitcoin/deps

INCLUDEPATHS= -I"$(DEPSDIR)/include"
LIBPATHS= -L"$(DEPSDIR)/lib"
WXLIBS=$(shell $(DEPSDIR)/bin/wx-config --libs --static)
WXBASELIBS=$(shell $(DEPSDIR)/bin/wx-config --libs base --static)

LIBS= -dead_strip \
 $(DEPSDIR)/lib/libdb_cxx-4.8.a \
 $(DEPSDIR)/lib/libboost_system.a \
 $(DEPSDIR)/lib/libboost_filesystem.a \
 $(DEPSDIR)/lib/libcrypto.a

WXDEFS=$(shell $(DEPSDIR)/bin/wx-config --cxxflags) -DNOPCH
DEBUGFLAGS=-g -DwxDEBUG_LEVEL=0
CFLAGS=-O2 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)
HEADERS=headers.h strlcpy.h serialize.h uint256.h util.h key.h bignum.h base58.h script.h db.h net.h irc.h main.h rpc.h uibase.h ui.h init.h sha.h


OBJS= \
    obj/util.o \
    obj/script.o \
    obj/db.o \
    obj/net.o \
    obj/irc.o \
    obj/main.o \
    obj/rpc.o \
    obj/init.o \
    cryptopp/obj/sha.o \
    cryptopp/obj/cpu.o


all : bitcoin

obj/%.o : %.cpp
        g++ $(CFLAGS) -c $<

cryptopp/obj/%.o: cryptopp/%.cpp
        g++ $(CFLAGS) -c $<

bitcoin : $(OBJS) obj/ui.o obj/uibase.o
        g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS)

headers.h.gch : headers.h $(HEADERS)
        g++ $(CFLAGS) -c $<

obj/nogui/%.o : %.cpp $(HEADERS)
        g++ $(CFLAGS) -DwxUSE_GUI=0 -c $<

bitcoind : $(OBJS:obj/%=obj/nogui/%) obj/sha.o
        g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(WXBASELIBS) $(LIBS)

clean :
        -rm -f bitcoin bitcoind
        -rm -f obj/*
        -rm -f obj/nogui/*
        -rm -f headers.h.gch

This at least does not stop prior to compilation even starting (unlike the previously mentioned Makefile). However I get the following compiler errors:

Code:

ui.cpp:19: error: expected constructor, destructor, or type conversion before '(' token
ui.cpp:22: error: expected constructor, destructor, or type conversion before '*' token
ui.cpp:24: error: 'wxLocale' does not name a type
...


weibullguy 07-16-2011 08:28 PM

Changing the Makefile isn't going to help. You either need to upgrade your version of Berkeley db to that version the Bitcoin developers are using, use an older version of Bitcoin that is compatible with the Berkely db version you have installed, or hack the Bitcoin code to be compatible with the Berkeley db version you have installed.

malloc 07-17-2011 01:49 AM

Quote:

Originally Posted by weibullguy (Post 4416937)
Changing the Makefile isn't going to help. You either need to upgrade your version of Berkeley db to that version the Bitcoin developers are using, use an older version of Bitcoin that is compatible with the Berkely db version you have installed, or hack the Bitcoin code to be compatible with the Berkeley db version you have installed.

Thanks again, but now I've tried dB-5.1.19 and dB-5.2.28 -- I get the exact same error on both:

Code:

ui.cpp:19: error: expected constructor, destructor, or type conversion before '(' token
ui.cpp:22: error: expected constructor, destructor, or type conversion before '*' token
ui.cpp:24: error: 'wxLocale' does not name a type
ui.cpp:46: error: variable or field 'HandleCtrlA' declared void
ui.cpp:46: error: 'wxKeyEvent' was not declared in this scope
ui.cpp:46: error: 'event' was not declared in this scope
ui.cpp: In function 'std::string DateStr(int64)':
ui.cpp:67: error: 'wxDateTime' was not declared in this scope
ui.cpp: In function 'std::string DateTimeStr(int64)':
ui.cpp:73: error: 'wxDateTime' was not declared in this scope
ui.cpp:73: error: expected ';' before 'datetime'
ui.cpp:75: error: 'datetime' was not declared in this scope
ui.cpp:77: error: 'datetime' was not declared in this scope
ui.cpp: At global scope:
ui.cpp:80: error: 'wxString' does not name a type
...

The g++ command issued is:

Code:

g++ -O2 -Wno-invalid-offsetof -Wformat -g -DwxDEBUG_LEVEL=0 -I/tmp/bitcoin/deps//lib/wx/include/gtk2-unicode-static-2.9 -I/tmp/bitcoin/deps//include/wx-2.9 -D_FILE_OFFSET_BITS=64 -DwxDEBUG_LEVEL=0 -D__WXGTK__ -pthread -DNOPCH -I"/tmp/bitcoin/deps/include" -c ui.cpp

weibullguy 07-17-2011 09:03 AM

Not surprising. Those errors have nothing to do with Berkeley db. The wx should clue you in that those errors are related to wxWidgets.

malloc 07-19-2011 10:53 AM

Quote:

Originally Posted by weibullguy (Post 4417278)
Not surprising. Those errors have nothing to do with Berkeley db. The wx should clue you in that those errors are related to wxWidgets.

I concur, but the error doesn't tell me anything beyond that it might be related to wxWidgets. What exactly am I supposed to do?

weibullguy 07-20-2011 09:08 PM

OK, so I installed Slackware 13.1, 32-bit in a virtual machine (IDK, I guess I was bored). I confirmed your original error with a fresh Slackware install. The reason was Berkeley DB is too old on 13.1 (hhhmmm, seems I said that before).

You will need to build against the latest wxWidgets (2.9 series) and the latest Berkeley DB (5.2.28). MiniUPNP is optional, but if you choose to build against it, you'll need the latest release of that as well. Slackware 13.1 comes with older versions of these libraries; the version of Boost that comes with 13.1 seems to be OK. Therefore, to get the latest bitcoin to build, you need to install the newer wxWidgets and Berkeley DB. I would recommend installing them in the /usr/local prefix so they don't overwrite your existing files. Installing in /usr/local is not the default for Berkeley DB.

Once you have the correct version of wxWidgets and db, you need to make some minor tweaks to makefile.unix. First change the line USE_UPNP:=0 to USE_UPNP:= Then change the -Bstatic to -Bdynamic in the LIBS variable. Or re-install Boost with the static libraries. The Bitcoin client and daemon will both successfully build after making these changes. I don't know if it works (I don't care either), but it builds without error.


All times are GMT -5. The time now is 03:25 AM.