Can one compile khello.cc ?

Scott W wegster at mindcore.net
Tue Mar 2 16:19:14 PST 2004


Charles McManis wrote:

>Ok, so this is now officially weird. I decided to try to compile khello.cc 
>from the KDE tutorial on my 4.8 system that has never had me attempt to 
>upgrade KDE on it. 
>
>When I compile khello.cc, it compiles fine, when I link it I get this:
>-----------------------------snip----------------------------------------------------------------
>ddp% make
>g++ -o khello -R/usr/X11R6/lib -L/usr/local/lib/kde3/ -L/usr/local/lib 
>-L/usr/X11R6/lib -lqt-mt -pthread -lkdeui -lkdecore -lXft khello.o
>/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
>warning: libstdc++.so.3, needed by /usr/X11R6/lib/libqt-mt.so, may conflict 
>with libstdc++.so.5
>/usr/lib/libc.so.4: WARNING!  setkey(3) not present in the system!
>/usr/lib/libc.so.4: warning: this program uses gets(), which is unsafe.
>/usr/lib/libc.so.4: warning: mktemp() possibly used unsafely; consider using 
>mkstemp()
>/usr/lib/libc.so.4: WARNING!  des_setkey(3) not present in the system!
>/usr/lib/libc.so.4: WARNING!  encrypt(3) not present in the system!
>/usr/lib/libc.so.4: warning: tmpnam() possibly used unsafely; consider using 
>mkstemp()
>/usr/lib/libc.so.4: warning: this program uses f_prealloc(), which is not 
>recommended.
>/usr/lib/libc.so.4: WARNING!  des_cipher(3) not present in the system!
>/usr/lib/libc.so.4: warning: tempnam() possibly used unsafely; consider using 
>mkstemp()
>khello.o(.text+0x2b): In function `main':
>: undefined reference to `QCString::QCString[in-charge](char const*)'
>khello.o(.text+0x48): In function `main':
>: undefined reference to `KApplication::KApplication[in-charge](int&, char**, 
>QCString const&, bool, bool)'
>khello.o(.text+0x68): In function `main':
>: undefined reference to `QCString::~QCString [in-charge]()'
>khello.o(.text+0x8e): In function `main':
>: undefined reference to `QCString::~QCString [in-charge]()'
>khello.o(.text+0xc2): In function `main':
>: undefined reference to `KMainWindow::KMainWindow[in-charge](QWidget*, char 
>const*, unsigned)'
>khello.o(.text+0x16e): In function `main':
>: undefined reference to `QApplication::setMainWidget(QWidget*)'
>khello.o(.text+0x19d): In function `main':
>: undefined reference to `QApplication::exec()'
>khello.o(.text+0x1b1): In function `main':
>: undefined reference to `KApplication::~KApplication [in-charge]()'
>khello.o(.text+0x1d7): In function `main':
>: undefined reference to `KApplication::~KApplication [in-charge]()'
>collect2: ld returned 1 exit status
>make: *** [khello] Error 1
>ddp% 
>-----------------------------------------------------------------------------------------
>So what am I missing?
>
>--Chuck
>_______________________________________________
>freebsd-questions at freebsd.org mailing list
>http://lists.freebsd.org/mailman/listinfo/freebsd-questions
>To unsubscribe, send any mail to "freebsd-questions-unsubscribe at freebsd.org"
>
>  
>
If you have a pointer to the KDE tutorial/code you're using, may be of 
more help, but here's a quick 'khello' program, step by step:

[wegster at db KDETutorial]$ cat main.cc
#include <qapplication.h>
#include <qpushbutton.h>

int     main(int argc,
                char **argv)
{
    QApplication app( argc, argv );

    QPushButton *hello=new QPushButton( "Hello world!", 0 );
    hello->resize(200, 30 );

    QObject::connect(hello,
                        SIGNAL(clicked()),
                        &app,
                        SLOT(quit()) );

    app.setMainWidget(hello);
    hello->show();

    return app.exec();
}

wegster at db KDETutorial]$ g++ main.cc

main.cc:1:26: qapplication.h: No such file or directory
main.cc:2:25: qpushbutton.h: No such file or directory
main.cc: In function `int main(int, char**)':
main.cc:7: `QApplication' undeclared (first use this function)
main.cc:7: (Each undeclared identifier is reported only once for each 
function
   it appears in.)
main.cc:7: syntax error before `(' token
main.cc:9: `QPushButton' undeclared (first use this function)
main.cc:9: `hello' undeclared (first use this function)
main.cc:9: syntax error before `(' token
main.cc:12: `QObject' undeclared (first use this function)
main.cc:12: syntax error before `::' token
main.cc:17: `app' undeclared (first use this function)

We're missing the header location in our include path (because we didn't 
specify one), so let's find it:

[wegster at db KDETutorial]$ locate qapplication.h
/usr/share/doc/qt-devel-3.1.2/html/qapplication.html
/usr/lib/qt-3.1/include/qapplication.h

The latter is the one we need, so feed the path as an include path to 
g++ via the -I switch:

[wegster at db KDETutorial]$ g++ main.cc -I /usr/lib/qt-3.1/include
/tmp/ccC2zAn3.o(.text+0x23): In function `main':
: undefined reference to `QApplication::QApplication[in-charge](int&, 
char**)'
/tmp/ccC2zAn3.o(.text+0x52): In function `main':
: undefined reference to `QString::QString[in-charge](char const*)'
/tmp/ccC2zAn3.o(.text+0x61): In function `main':
: undefined reference to `QPushButton::QPushButton[in-charge](QString 
const&, QWidget*, char const*)'
/tmp/ccC2zAn3.o(.text+0x12c): In function `main':
: undefined reference to `QObject::connect(QObject const*, char const*, 
QObject const*, char const*)'
/tmp/ccC2zAn3.o(.text+0x13e): In function `main':
: undefined reference to `QApplication::setMainWidget(QWidget*)'
/tmp/ccC2zAn3.o(.text+0x164): In function `main':
: undefined reference to `QApplication::exec()'
/tmp/ccC2zAn3.o(.text+0x175): In function `main':
: undefined reference to `QApplication::~QApplication [in-charge]()'
/tmp/ccC2zAn3.o(.text+0x195): In function `main':
: undefined reference to `QApplication::~QApplication [in-charge]()'
/tmp/ccC2zAn3.o(.gnu.linkonce.t._ZN7QStringD1Ev+0x21): In function 
`QString::~QString [in-charge]()':
: undefined reference to `QString::shared_null'
/tmp/ccC2zAn3.o(.gnu.linkonce.t._ZN7QStringD1Ev+0x30): In function 
`QString::~QString [in-charge]()':
: undefined reference to `QStringData::deleteSelf()'
collect2: ld returned 1 exit status

Looks like what you've got, which isn't surprising- I'll bet we can 
compile to an object file only however, let's test using -c for 'compile 
but don't link' to g++:

[wegster at db KDETutorial]$ g++ -c main.cc -I /usr/lib/qt-3.1/include
[wegster at db KDETutorial]$ ls -l main.*
-rw-rw-r--    1 wegster  wegster       380 Mar  2 19:05 main.cc
-rw-rw-r--    1 wegster  wegster      2816 Mar  2 19:13 main.o

Yep, that works.  But to get a running executable, you need to resolve 
library dependencies, in this case likely the QT library...let's find it 
first:

[wegster at db KDETutorial]$ locate libqt
/usr/lib/qt-3.1/lib/libqt-mt.so.3.1.2
/usr/lib/qt-3.1/lib/libqt-mt.so.3
/usr/lib/qt-3.1/lib/libqt-mt.so.3.1
/usr/lib/qt-3.1/lib/libqt.so.3.1
/usr/lib/qt-3.1/lib/libqt.so.3
/usr/lib/qt-3.1/lib/libqt.so.3.1.2
/usr/lib/qt-3.1/lib/libqt-mt.so
/usr/lib/qt-3.1/lib/libqt.so
/usr/lib/libqthreads.so.12.3.0
/usr/lib/libqthreads.so.12
/usr/lib/libqtmcop.la
/usr/lib/libqtmcop.so.1
/usr/lib/libqtmcop.so.1.0.0
/usr/lib/libqtmcop.so

What we really want here is likely the libqt, so add the compile time 
library path via -L switches, and finally the short name (lib name - the 
'lib' prefix and the versioning) of the library we want to link against:

[wegster at db KDETutorial]$ g++ main.cc -I /usr/lib/qt-3.1/include 
-L/usr/lib/qt-3.1/lib/ -lqt
[wegster at db KDETutorial]$ ./a.out

Works ;-)

NOTE:  This was done on a RHES system, because I've got the KDE 
development headers and libs installed.  For FreeBSD, you'll need the qt 
sources or a KDE development package, although I'm not entirely sure 
which offhand...

HTH,
Scott



More information about the freebsd-questions mailing list