Can one compile khello.cc ?
Charles McManis
cmcmanis at mcmanis.com
Tue Mar 2 18:40:03 PST 2004
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 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();
> }
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 at 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 at 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 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...
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
More information about the freebsd-questions
mailing list