Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Mar 2004 18:43:19 -0800
From:      Charles McManis <cmcmanis@mcmanis.com>
To:        Scott W <wegster@mindcore.net>
Cc:        freebsd-questions@freebsd.org
Subject:   Re: Can one compile khello.cc ?
Message-ID:  <200403021843.19858.cmcmanis@mcmanis.com>
In-Reply-To: <4045247E.2050100@mindcore.net>
References:  <200403021119.06516.cmcmanis@mcmanis.com> <4045247E.2050100@mindcore.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Thanks Scott for some patient steps toward getting things going. It took many 
additional steps, but I think I've finally got it going ... to wit:

On Tuesday 02 March 2004 16:19, Scott W wrote:
> 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:

On this page:
<http://developer.kde.org/documentation/tutorials/>;

Is a link to the "Khello" tutorial.  Your source code was :

> [wegster@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();
> }

This is the khello.cc source code:
#include <kapp.h>
#include <kmainwindow.h>

int main( int argc, char **argv )
{
  KApplication a( argc, argv, "khello" );
  KMainWindow *w = new KMainWindow();
  w->setGeometry(100,100,200,100);

  a.setMainWidget( w );
  w->show();
  return a.exec();
}

It is similar to yours, while yours is nominally a "Qt" application, KHello is 
a "KDE" application and uses the KDE libraries.

However, using your example code instead ...

> wegster@db KDETutorial]$ g++ main.cc

This behaves the same, and adding -I/usr/X11R6/include allows it to find the 
qt header files.

> 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:

And on FBSD there is no libqt, instead you get libqt-mt. I don't know why, but 
it just is. The port directory is /usr/ports/x11-toolkits/qt31 and the 
resulting package only has libqt-mt.

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

On your RHES system that just returns to the prompt, on a FBSD 4.8 system it 
gives you this:

ddp% g++ main.cc -I/usr/X11R6/include -L/usr/X11R6/lib -lqt-mt
/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
warning: libGL.so.1, needed by /usr/X11R6/lib/libqt-mt.so, not found (try 
using -rpath or -rpath-link)
/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
warning: libXmu.so.6, needed by /usr/X11R6/lib/libqt-mt.so, not found (try 
using -rpath or -rpath-link)
/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
warning: libXrender.so.1, needed by /usr/X11R6/lib/libqt-mt.so, not found 
(try using -rpath or -rpath-link)
/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
warning: libXft.so.2, needed by /usr/X11R6/lib/libqt-mt.so, not found (try 
using -rpath or -rpath-link)
/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
warning: libXext.so.6, needed by /usr/X11R6/lib/libqt-mt.so, not found (try 
using -rpath or -rpath-link)
/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
warning: libX11.so.6, needed by /usr/X11R6/lib/libqt-mt.so, not found (try 
using -rpath or -rpath-link)
/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
warning: libSM.so.6, needed by /usr/X11R6/lib/libqt-mt.so, not found (try 
using -rpath or -rpath-link)
/usr/local/gnu/lib/gcc-lib/i386-unknown-freebsd4.8/3.2.3/../../../../i386-unknown-freebsd4.8/bin/ld: 
warning: libICE.so.6, needed by /usr/X11R6/lib/libqt-mt.so, not found (try 
using -rpath or -rpath-link)
/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
/var/tmp//cchuRUZV.o(.text+0x23): In function `main':
: undefined reference to `QApplication::QApplication[in-charge](int&, char**)'
/var/tmp//cchuRUZV.o(.text+0x52): In function `main':
: undefined reference to `QString::QString[in-charge](char const*)'
/var/tmp//cchuRUZV.o(.text+0x61): In function `main':
: undefined reference to `QPushButton::QPushButton[in-charge](QString const&, 
QWidget*, char const*)'
/var/tmp//cchuRUZV.o(.text+0x12c): In function `main':
: undefined reference to `QObject::connect(QObject const*, char const*, 
QObject const*, char const*)'
/var/tmp//cchuRUZV.o(.text+0x13e): In function `main':
: undefined reference to `QApplication::setMainWidget(QWidget*)'
/var/tmp//cchuRUZV.o(.text+0x164): In function `main':
: undefined reference to `QApplication::exec()'
/var/tmp//cchuRUZV.o(.text+0x175): In function `main':
: undefined reference to `QApplication::~QApplication [in-charge]()'
/var/tmp//cchuRUZV.o(.text+0x195): In function `main':
: undefined reference to `QApplication::~QApplication [in-charge]()'
/var/tmp//cchuRUZV.o(.gnu.linkonce.t._ZN7QStringD1Ev+0x21): In function 
`QString::~QString [in-charge]()':
: undefined reference to `QString::shared_null'
/var/tmp//cchuRUZV.o(.gnu.linkonce.t._ZN7QStringD1Ev+0x30): In function 
`QString::~QString [in-charge]()':
: undefined reference to `QStringData::deleteSelf()'
/usr/X11R6/lib/libqt-mt.so: undefined reference to `XFreePixmap'
/usr/X11R6/lib/libqt-mt.so: undefined reference to `XSetInputFocus'
/usr/X11R6/lib/libqt-mt.so: undefined reference to `pthread_cleanup_pop'
/usr/X11R6/lib/libqt-mt.so: undefined reference to `glXQueryServerString'
... snip LOTS of undefined references ...
/usr/X11R6/lib/libqt-mt.so: undefined reference to `XOpenDisplay'
/usr/X11R6/lib/libqt-mt.so: undefined reference to `FcFontSetDestroy'
/usr/X11R6/lib/libqt-mt.so: undefined reference to `XDrawImageString16'
/usr/X11R6/lib/libqt-mt.so: undefined reference to `glXCreateGLXPixmap'
/usr/X11R6/lib/libqt-mt.so: undefined reference to `XftDrawPicture'
collect2: ld returned 1 exit status
ddp%

> [wegster@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...

Of course following in your excellent footsteps of doing this one step at a 
time, if I change the compile line to include -R/usr/X11R6/lib and -pthread 
because threading is required on FBSD apparently, I'm left with this:

ddp% g++ main.cc -I/usr/X11R6/include -L/usr/X11R6/lib -R/usr/X11R6/lib 
-lqt-mt -pthread
/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()
/var/tmp//ccDbWE2R.o(.text+0x23): In function `main':
: undefined reference to `QApplication::QApplication[in-charge](int&, char**)'
/var/tmp//ccDbWE2R.o(.text+0x52): In function `main':
: undefined reference to `QString::QString[in-charge](char const*)'
/var/tmp//ccDbWE2R.o(.text+0x61): In function `main':
: undefined reference to `QPushButton::QPushButton[in-charge](QString const&, 
QWidget*, char const*)'
/var/tmp//ccDbWE2R.o(.text+0x12c): In function `main':
: undefined reference to `QObject::connect(QObject const*, char const*, 
QObject const*, char const*)'
/var/tmp//ccDbWE2R.o(.text+0x13e): In function `main':
: undefined reference to `QApplication::setMainWidget(QWidget*)'
/var/tmp//ccDbWE2R.o(.text+0x164): In function `main':
: undefined reference to `QApplication::exec()'
/var/tmp//ccDbWE2R.o(.text+0x175): In function `main':
: undefined reference to `QApplication::~QApplication [in-charge]()'
/var/tmp//ccDbWE2R.o(.text+0x195): In function `main':
: undefined reference to `QApplication::~QApplication [in-charge]()'
/var/tmp//ccDbWE2R.o(.gnu.linkonce.t._ZN7QStringD1Ev+0x21): In function 
`QString::~QString [in-charge]()':
: undefined reference to `QString::shared_null'
/var/tmp//ccDbWE2R.o(.gnu.linkonce.t._ZN7QStringD1Ev+0x30): In function 
`QString::~QString [in-charge]()':
: undefined reference to `QStringData::deleteSelf()'
collect2: ld returned 1 exit status
ddp%

Now being really confused I tracked down part of the problem to that message 
about std++0.5.0 and realized I had a newer g++ in my path (ahh the joys of 
an rdisted /usr/local/bin) So I fixed up my path to force the one from 
/usr/bin to be used and now with minor annoyances your simple program works.
(annoyances in the form of some complaint about GLX on the :0 display)

However, when I go back to my KDE application whch is using KApplication and 
KWindow, so my final link line is something like:

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 -lkdecore -lkdeui khello.o
/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()
ddp% ./khello
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
ddp%

Not sure if I can squelch the libc warnings but at least I've got a simple 
program compiled.

--Chuck



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200403021843.19858.cmcmanis>