linking error. Perhaps a problem with ordering? - c

I'm building a program which uses GTK+3 and pango. Most of it compiles fine apart from the last bit which builds the executable. The final command is:
gcc -o z80sim main.c -Wall -Iz80 -Igui obj/disas.o obj/iosim.o obj/sim0.o obj/sim1.o obj/sim2.o obj/sim3.o obj/sim4.o obj/sim5.o obj/sim6.o obj/sim7.o obj/simctl.o obj/simfun.o obj/simglb.o obj/simint.o obj/callbacks.o obj/code.o obj/guiglb.o obj/memory.o obj/flags.o obj/log.o obj/ports.o obj/registers.o `pkg-config --cflags --libs gtk+-3.0`
But I get this error message:
obj/sim1.o: In function `cpu':
sim1.c:(.text+0x2cb): undefined reference to `check_gui_break'
obj/callbacks.o: In function `on_open1_activate':
callbacks.c:(.text+0x20): undefined reference to `Get_File'
:
:
Where check_gui_break is defined and called in sim1.c etc.
This has to be something to do with the ordering of object files and libraries on the ld call, but I have tried putting the pkg-config part before and after the individual .o files and it still gives the same errors.
I've read the very informative https://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking but, although I know a lot more now, I still can't crack this one.
BTW.
pkg-config --cflags --libs gtk+-3.0
gives
-pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
Please will some kind soul take pity on me and enlighten me?

It appears that most of the errors I've encountered have been a result of the transition from Glade2 to Glade3. In 2, Glade generates some C code which is what's missing from my code. Back to the reference manual to see how to modernise the code.

Related

fatal error: gtk/gtk.h: No such file or directory

im trying to compile a basic code with GTK3+ on Debian11 and i got the following error:
fatal error: gtk/gtk.h: No such file or directory
im using vs code and the autocomplete find the path to the file gtk.h but showme a include errors.
I compile with this command: gcc main.c -o main 'pkg-config --cflags --libs gtk+-3.0'
The output of pgk-config --cflags --libs gtk+-3.0:
:~/Code/GTK/gtkTutorial$ pkg-config --cflags --libs gtk+-3.0
-I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/uuid -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/x86_64-linux-gnu -I/usr/include/gio-unix-2.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -pthread -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
I try to put the complete path in the #include </usr/include/gtk-3-0/gtk/gtk.h> and it give me the next include error for gdk.h file on the gtk.h file.
Both files (gtk.h and gtk.h) exist on my /usr/include/gtk-3.0/gtk/ and /usr/include/gtk-3.0/gdk/ directories.
The code i'm trying to compile is:
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// gtk code comes here
gtk_main();
return 0;
}
I don't understand what I'm doing wrong.
any idea, or someone with the same problem?
thanks.

How to use GTK C library?

I'm new at C and started to learn how to create GUI.
For some reason the only way program run is
gcc simple.c -o simple -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12
If i just run gcc simple.cit gives me
In file included from /usr/include/glib-2.0/glib/galloca.h:32:0,
from /usr/include/glib-2.0/glib.h:30,
from /usr/include/glib-2.0/gobject/gbinding.h:28,
from /usr/include/glib-2.0/glib-object.h:23,
from /usr/include/glib-2.0/gio/gioenums.h:28,
from /usr/include/glib-2.0/gio/giotypes.h:28,
from /usr/include/glib-2.0/gio/gio.h:26,
from /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30,
from /usr/include/gtk-2.0/gdk/gdk.h:32,
from /usr/include/gtk-2.0/gtk/gtk.h:32,
from graphical.c:1:/usr/include/glib-2.0/glib/gtypes.h:32:24: fatal error: glibconfig.h: No such file or catalog compilation terminated.
If I do other 'traditional' ways to include lib:
gcc `pkg-config gtk+-2.0 --cflags` example.c -o example `pkg-config gtk+-2.0 --libs`
It gives me:
Package gtk+-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtk+-2.0.pc' to the PKG_CONFIG_PATH environment variable
No package 'gtk+-2.0' found
graphical.c:1:21: fatal error: gtk/gtk.h: No such file or catalog
What is the right way to include GTK?
I just figured out what was the problem.
I had linuxbrew installed and for some reason pkg-config took path from one of it's repos even if I force it to export.
I completely removed linuxbrew and now it's finally working!

Get full compilation command in CMake

If you execute vim --version, it will show some information about how it was compiled. On my system, it looks like this:
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libdrm -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-rpath,/usr/lib/perl5/core_perl/CORE -Wl,-O1,--sort-common,--as-needed,-z,relro -L/usr/local/lib -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lSM -lICE -lXt -lX11 -lXdmcp -lSM -lICE -lm -lncurses -lelf -lnsl -lacl -lattr -lgpm -ldl -L/usr/lib -llua -Wl,-E -Wl,-rpath,/usr/lib/perl5/core_perl/CORE -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -L/usr/local/lib -L/usr/lib/perl5/core_perl/CORE -lperl -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc -L/usr/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -lruby -lpthread -lgmp -ldl -lcrypt -lm -L/usr/lib
```
I want to add similar information to the version output of an application that is built using CMake.
I know that there are variables like CMAKE_C_FLAGS, but it depends on other variables if these are actually used. For example, CMAKE_C_FLAGS_RELEASE is used if CMAKE_BUILD_TYPE=Release is specified. Thus it might be error-prone to try to piece this information together from individual CMake variables, and in the end you can't be sure that this is really what CMake uses to compile your sources.
Is there a way to get the actual command CMake uses to compile a source file, similar to the output from vim --version above?
moreover, CMAKE_C_FLAGS could vary for different source files, directories and targets… so your output can be far from accurate…
and using variables like CMAKE_BUILD_TYPE is pretty stable actually and may give you what you want:
string(TOUPPER "${CMAKE_BUILD_TYPE}" _type_upcase)
# Yeah! CMake can do double expand!
set(_cflags "${CMAKE_C_FLAGS_${_type_upcase}}")
little problem is: make sure CMAKE_BUILD_TYPE is set and valid before get the value!
advanced way:
one may use CMAKE_<lang>_COMPILE_OBJECT variable to get a "compile template". then use directory properties to collect COMPILE_DEFINITIONS and replace a pattern <DEFINES> in the template. then collect INCLUDE_DIRECTORIES and other options depending on build type.
You may look here for inspiration.

gcc raises "unrecognized command line option" error with pkg-config

I am trying to compile a gtk program using the tutorial here. When I issue the command
gcc -o tut tut.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)
I get the following error:
gcc: error: unrecognized command line option ‘-pthread -I/usr/include/gtk-2.0
-I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0
-I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0
-I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/glib-2.0
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1
-I/usr/include/libpng12 -I/usr/include/harfbuzz -Wl,--export-dynamic -pthread
-lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0
-lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig -lgobject-2.0 -lfreetype
-lgmodule-2.0 -lglib-2.0 ’
gcc is version 4.8.2. pkg-config is version 0.26. i have libgtk2.0-dev installed.
I can compile simple c programs fine.
How do I resolve the "unrecognized command" problem?
[update from comment]
I am using zsh.
This looks like a shell issue.
What shell are you using?
In case it's not bash, give bash a try.

Compiling GTK-app in c with cygwin: invalid argument

I thought everything was ok since I installed
MinGW
gtk3
gtkmm
cygWin
And I have no problem to compile ordinary simple files. Neither do I have problem with commands such as
$ pkg-config --cflags --libs gtk+-2.0
it outputs
-mms-bitfields -IC:/gtkmm/include/gtk-2.0 -IC:/gtkmm/lib/gtk-2.0/include
- IC:/gtkmm/include/atk-1.0 -IC:/gtkmm/include/cairo -IC:/gtkmm/include/gdk-pixbuf
-2.0 - IC:/gtkmm/include/pango-1.0 -IC:/gtkmm/include/glib-2.0 -IC:/gtkmm/lib/glib
-2.0/include -IC:/gtkmm/include -IC:/gtkmm/include/freetype2
-IC:/gtkmm/include/libpng14 -LC:/gtkmm/lib -Lc:/devel/dist/win32/libpng-1.4.3-1/lib
-lgtk-win32-2.0 -lgdk-win32-2.0 - latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32
-lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpng14 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule
-2.0 -lgthread-2.0 -lglib-2.0 -lintl
But when I try to compile a simple gtk-app from a tutorial with
$ gcc c_gui.c -o c_gui `pkg-config --cflags --libs gtk+-2.0`
I get an error from the cygwin terminalwindow:
:gcc.exe: error: -LC:/gtkmm/lib: Invalid argument
What could possibly be wrong?
Something seems to be wrong with your pkgconfig. It shouldn't be returning DOS style paths. If I run your exact command above, I get:
-D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/libpng15 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/harfbuzz -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangocairo-1.0 -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lgio-2.0 -lcairo -lpixman-1 -lGL -lpthread -lxcb-shm -lxcb-render -lXrender -lXext -lXdamage -lX11-xcb -lxcb-glx -lXfixes -lX11 -lxcb -lXau -lXdmcp -lharfbuzz -lpango-1.0 -lfontconfig -lgmodule-2.0 -lgobject-2.0 -lffi -lglib-2.0 -lintl -liconv -lpcre -lexpat -lfreetype -lbz2 -lpng15 -lm -lz
I suspect it's because you're trying to mix MinGW and Cygwin. They don't always work well together.
My /usr/lib/pkgconfig/gtk+-2.0.pc looks like this:
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=${prefix}/include
target=x11
gtk_binary_version=2.10.0
gtk_host=x86_64-unknown-cygwin
Name: GTK+
Description: GTK+ Graphical UI Library (${target} target)
Version: 2.24.23
Requires: gdk-${target}-2.0 atk cairo gdk-pixbuf-2.0 gio-2.0 pangoft2
Libs: -L${libdir} -lgtk-${target}-2.0
Cflags: -I${includedir}/gtk-2.0
which looks reasonable to me.

Resources