ld can't find the ncurses panel library

I’m running OpenSuSE 13.1 on x86_64 hardware. I’m trying to compile the examples from TLDP howto for ncurses with gcc 4.8.1, and it has worked fine up until the examples for the extensions for panels, menus and forms.
At first when I compiled with


$gcc -o ../obj/example14 example14.c

I got an error saying that panel.h is not found:


example14.c:1:19: fatal error: panel.h: No such file or directory
 #include <panel.h>
                   ^
compilation terminated.

I fixed that with


$gcc **-I /usr/include/ncurses** -o ../obj/example14 example14.c

but that produces these errors:


/tmp/ccOJDxnY.o: In function `main':
example14.c:(.text+0x25): undefined reference to `initscr'
example14.c:(.text+0x2a): undefined reference to `cbreak'
example14.c:(.text+0x2f): undefined reference to `noecho'
example14.c:(.text+0x42): undefined reference to `newwin'
example14.c:(.text+0x5f): undefined reference to `newwin'
example14.c:(.text+0x7c): undefined reference to `newwin'
example14.c:(.text+0xd0): undefined reference to `wborder'
example14.c:(.text+0xe6): undefined reference to `new_panel'
example14.c:(.text+0xf6): undefined reference to `new_panel'
example14.c:(.text+0x106): undefined reference to `new_panel'
example14.c:(.text+0x10f): undefined reference to `update_panels'
example14.c:(.text+0x114): undefined reference to `doupdate'
example14.c:(.text+0x11b): undefined reference to `stdscr'
example14.c:(.text+0x123): undefined reference to `wgetch'
example14.c:(.text+0x128): undefined reference to `endwin'
collect2: error: ld returned 1 exit status

Looking in /usr/lib64, I see the following libraries:


/usr/lib64/libform.a
/usr/lib64/libform.so -> libform.so.5
/usr/lib64/libform.so.5 -> libform.so.5.9
/usr/lib64/libform.so.5.9
/usr/lib64/libform.so.6 -> libform.so.6.0
/usr/lib64/libform.so.6.0
/usr/lib64/libformw.a
/usr/lib64/libformw.so -> libformw.so.5
/usr/lib64/libformw.so.5 -> libformw.so.5.9
/usr/lib64/libformw.so.5.9
/usr/lib64/libformw.so.6 -> libformw.so.6.0
/usr/lib64/libformw.so.6.0
/usr/lib64/libmenu.a
/usr/lib64/libmenu.so -> libmenu.so.5
/usr/lib64/libmenu.so.5 -> libmenu.so.5.9
/usr/lib64/libmenu.so.5.9
/usr/lib64/libmenu.so.6 -> libmenu.so.6.0
/usr/lib64/libmenu.so.6.0
/usr/lib64/libmenuw.a
/usr/lib64/libmenuw.so -> libmenuw.so.5
/usr/lib64/libmenuw.so.5 -> libmenuw.so.5.9
/usr/lib64/libmenuw.so.5.9
/usr/lib64/libmenuw.so.6 -> libmenuw.so.6.0
/usr/lib64/libmenuw.so.6.0
/usr/lib64/libncurses.a
/usr/lib64/libncurses++.a
/usr/lib64/libncurses.so
/usr/lib64/libncurses++.so -> libncurses++.so.5
/usr/lib64/libncurses++.so.5 -> libncurses++.so.5.9
/usr/lib64/libncurses++.so.5.9
/usr/lib64/libncurses++.so.6 -> libncurses++.so.6.0
/usr/lib64/libncurses++.so.6.0
/usr/lib64/libncurses++w.a
/usr/lib64/libncursesw.a
/usr/lib64/libncurses++w.so -> libncurses++w.so.5
/usr/lib64/libncursesw.so
/usr/lib64/libncurses++w.so.5 -> libncurses++w.so.5.9
/usr/lib64/libncurses++w.so.5.9
/usr/lib64/libncurses++w.so.6 -> libncurses++w.so.6.0
/usr/lib64/libncurses++w.so.6.0
/usr/lib64/libpanel.a
/usr/lib64/libpanel.so -> libpanel.so.5
/usr/lib64/libpanel.so.5 -> libpanel.so.5.9
/usr/lib64/libpanel.so.5.9
/usr/lib64/libpanel.so.6 -> libpanel.so.6.0
/usr/lib64/libpanel.so.6.0
/usr/lib64/libpanelw.a
/usr/lib64/libpanelw.so -> libpanelw.so.5
/usr/lib64/libpanelw.so.5 -> libpanelw.so.5.9
/usr/lib64/libpanelw.so.5.9
/usr/lib64/libpanelw.so.6 -> libpanelw.so.6.0
/usr/lib64/libpanelw.so.6.0
/usr/lib64/ncurses6
/usr/lib64/ncurses6/libform.a
/usr/lib64/ncurses6/libform.so -> ../libform.so.6
/usr/lib64/ncurses6/libformw.a
/usr/lib64/ncurses6/libformw.so -> ../libformw.so.6
/usr/lib64/ncurses6/libmenu.a
/usr/lib64/ncurses6/libmenu.so -> ../libmenu.so.6
/usr/lib64/ncurses6/libmenuw.a
/usr/lib64/ncurses6/libmenuw.so -> ../libmenuw.so.6
/usr/lib64/ncurses6/libncurses.a
/usr/lib64/ncurses6/libncurses++.a
/usr/lib64/ncurses6/libncurses.so
/usr/lib64/ncurses6/libncurses++.so
/usr/lib64/ncurses6/libncurses++w.a
/usr/lib64/ncurses6/libncursesw.a
/usr/lib64/ncurses6/libncurses++w.so
/usr/lib64/ncurses6/libncursesw.so
/usr/lib64/ncurses6/libpanel.a
/usr/lib64/ncurses6/libpanel.so -> ../libpanel.so.6
/usr/lib64/ncurses6/libpanelw.a
/usr/lib64/ncurses6/libpanelw.so -> ../libpanelw.so.6
/usr/lib64/ncurses6/libtic.a
/usr/lib64/ncurses6/libtic.so -> ../libtic.so.6
/usr/lib64/ncurses6/libtinfo.a
/usr/lib64/ncurses6/libtinfo.so -> /lib64/libtinfo.so.6

I tried adding the ncurses6 sublibrary as well, but that got me this:


$gcc -I /usr/include/ncurses -l/usr/lib64/ **-l/usr/lib64/ncurses6** -o ../obj/example14 example14.c
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -l/usr/lib64/
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -l/usr/lib64/ncurses6
collect2: error: ld returned 1 exit status

I have looked through the threads in this forum and Using the GNU Compiler Collection but I’m stumped.

So, what simple error am I making here?

On Fri, 29 Aug 2014 05:46:01 +0000, jlturriff wrote:

> So, what simple error am I making here?

Have you installed the ncurses-devel package?

Jim


Jim Henderson
openSUSE Forums Administrator
Forum Use Terms & Conditions at http://tinyurl.com/openSUSE-T-C

That’s wrong syntax.
“-l” specifies a library to link to, so -l/usr/lib64 is just plain nonsense. You can specify the linker search path with “-L” instead, but it isn’t necessary in this case as /usr/lib64 is of course is the standard search path.

And “-l/usr/lib64/ncurses6” is wrong as well. You should only specify the library name, not the directory. It is automatically searched in the linker search path.
So “-lncurses6” should work.

See also “man ld”.

A note though: you should probably use “-lncurses5”, as /usr/include/ncurses/ contains the includes for ncurses5.
The ncurses6 includes are in /usr/include/ncurses6/.

And another hint:
You can use “ncursesX-config” to get the necessary compiler/linker switches.
E.g.:

:~> ncurses5-config --cflags
-I/usr/include/ncurses
:~> ncurses5-config --libs
-lncurses -ltinfo
:~> ncurses5-config --cflags --libs
-I/usr/include/ncurses
-lncurses -ltinfo

For all possible options, see “ncurses5-config --help”.
This should successfully compile your example:

gcc `ncurses5-config --cflags --libs` -o ../obj/example14 example14.c

If you want to compile/link against ncurses6, you should use “ncurses6-config” instead obviously.


[rpm -qa|grep ncurses
libncurses5-32bit-5.9-33.1.2.x86_64
ncurses-utils-5.9-33.1.2.x86_64
libyui-ncurses5-2.44.1-2.1.4.x86_64
libyui-ncurses-pkg5-2.44.4-2.1.5.x86_64
libncurses6-5.9-33.1.2.x86_64
ncurses-devel-5.9-33.1.2.x86_64
libncurses5-5.9-33.1.2.x86_64](http://tinyurl.com/openSUSE-T-C)

Building repository ‘openSUSE BuildService - Mozilla’ cache …[done]
Loading repository data…
Reading installed packages…
‘ncurses6-devel’ not found in package names. Trying capabilities.
No provider of ‘ncurses6-devel’ found.
Resolving package dependencies…

Nothing to do.



   Maybe that's the wrong name for it.  When I look for ncurses6 packages at the OpenSuSE Download page it shows a debug package but no devel package (I checked the "Show Development, Language and debug packages").](http://tinyurl.com/openSUSE-T-C)[When I list the files provided by ncurses-devel-5.9, I see ncurses6 parts:](http://tinyurl.com/openSUSE-T-C)```

$rpm -q ncurses-devel-5.9 --filesbypkg
ncurses-devel             /usr/bin/captoinfo
ncurses-devel             /usr/bin/infocmp
ncurses-devel             /usr/bin/infotocap
ncurses-devel             /usr/bin/ncurses5-config
ncurses-devel             /usr/bin/ncurses6-config
ncurses-devel             /usr/bin/ncursesw5-config
ncurses-devel             /usr/bin/ncursesw6-config
ncurses-devel             /usr/bin/tic
ncurses-devel             /usr/include/curses.h
ncurses-devel             /usr/include/ncurses
ncurses-devel             /usr/include/ncurses.h
ncurses-devel             /usr/include/ncurses/curses.h
ncurses-devel             /usr/include/ncurses/cursesapp.h
ncurses-devel             /usr/include/ncurses/cursesf.h
ncurses-devel             /usr/include/ncurses/cursesm.h
ncurses-devel             /usr/include/ncurses/cursesp.h
ncurses-devel             /usr/include/ncurses/cursesw.h
ncurses-devel             /usr/include/ncurses/cursslk.h
ncurses-devel             /usr/include/ncurses/eti.h
ncurses-devel             /usr/include/ncurses/etip.h
ncurses-devel             /usr/include/ncurses/form.h
ncurses-devel             /usr/include/ncurses/menu.h
ncurses-devel             /usr/include/ncurses/nc_tparm.h
ncurses-devel             /usr/include/ncurses/ncurses.h
ncurses-devel             /usr/include/ncurses/ncurses_dll.h
ncurses-devel             /usr/include/ncurses/panel.h
ncurses-devel             /usr/include/ncurses/term.h
ncurses-devel             /usr/include/ncurses/term_entry.h
ncurses-devel             /usr/include/ncurses/termcap.h
ncurses-devel             /usr/include/ncurses/tic.h
ncurses-devel             /usr/include/ncurses/unctrl.h
ncurses-devel             /usr/include/ncurses6
ncurses-devel             /usr/include/ncurses6/curses.h
ncurses-devel             /usr/include/ncurses6/ncurses
ncurses-devel             /usr/include/ncurses6/ncurses.h
ncurses-devel             /usr/include/ncurses6/ncurses/curses.h
ncurses-devel             /usr/include/ncurses6/ncurses/cursesapp.h
ncurses-devel             /usr/include/ncurses6/ncurses/cursesf.h
ncurses-devel             /usr/include/ncurses6/ncurses/cursesm.h
ncurses-devel             /usr/include/ncurses6/ncurses/cursesp.h
ncurses-devel             /usr/include/ncurses6/ncurses/cursesw.h
ncurses-devel             /usr/include/ncurses6/ncurses/cursslk.h
ncurses-devel             /usr/include/ncurses6/ncurses/eti.h
ncurses-devel             /usr/include/ncurses6/ncurses/etip.h
ncurses-devel             /usr/include/ncurses6/ncurses/form.h
ncurses-devel             /usr/include/ncurses6/ncurses/menu.h
ncurses-devel             /usr/include/ncurses6/ncurses/nc_tparm.h
ncurses-devel             /usr/include/ncurses6/ncurses/ncurses.h
ncurses-devel             /usr/include/ncurses6/ncurses/ncurses_dll.h
ncurses-devel             /usr/include/ncurses6/ncurses/panel.h
ncurses-devel             /usr/include/ncurses6/ncurses/term.h
ncurses-devel             /usr/include/ncurses6/ncurses/term_entry.h
ncurses-devel             /usr/include/ncurses6/ncurses/termcap.h
ncurses-devel             /usr/include/ncurses6/ncurses/tic.h
ncurses-devel             /usr/include/ncurses6/ncurses/unctrl.h
ncurses-devel             /usr/include/ncurses6/ncursesw
ncurses-devel             /usr/include/ncurses6/ncursesw/curses.h
ncurses-devel             /usr/include/ncurses6/ncursesw/cursesapp.h
ncurses-devel             /usr/include/ncurses6/ncursesw/cursesf.h
ncurses-devel             /usr/include/ncurses6/ncursesw/cursesm.h
ncurses-devel             /usr/include/ncurses6/ncursesw/cursesp.h
ncurses-devel             /usr/include/ncurses6/ncursesw/cursesw.h
ncurses-devel             /usr/include/ncurses6/ncursesw/cursslk.h
ncurses-devel             /usr/include/ncurses6/ncursesw/eti.h
ncurses-devel             /usr/include/ncurses6/ncursesw/etip.h
ncurses-devel             /usr/include/ncurses6/ncursesw/form.h
ncurses-devel             /usr/include/ncurses6/ncursesw/menu.h
ncurses-devel             /usr/include/ncurses6/ncursesw/nc_tparm.h
ncurses-devel             /usr/include/ncurses6/ncursesw/ncurses.h
ncurses-devel             /usr/include/ncurses6/ncursesw/ncurses_dll.h
ncurses-devel             /usr/include/ncurses6/ncursesw/panel.h
ncurses-devel             /usr/include/ncurses6/ncursesw/term.h
ncurses-devel             /usr/include/ncurses6/ncursesw/term_entry.h
ncurses-devel             /usr/include/ncurses6/ncursesw/termcap.h
ncurses-devel             /usr/include/ncurses6/ncursesw/tic.h
ncurses-devel             /usr/include/ncurses6/ncursesw/unctrl.h
ncurses-devel             /usr/include/ncurses6/term.h
ncurses-devel             /usr/include/ncursesw
ncurses-devel             /usr/include/ncursesw/curses.h
ncurses-devel             /usr/include/ncursesw/cursesapp.h
ncurses-devel             /usr/include/ncursesw/cursesf.h
ncurses-devel             /usr/include/ncursesw/cursesm.h
ncurses-devel             /usr/include/ncursesw/cursesp.h
ncurses-devel             /usr/include/ncursesw/cursesw.h
ncurses-devel             /usr/include/ncursesw/cursslk.h
ncurses-devel             /usr/include/ncursesw/eti.h
ncurses-devel             /usr/include/ncursesw/etip.h
ncurses-devel             /usr/include/ncursesw/form.h
ncurses-devel             /usr/include/ncursesw/menu.h
ncurses-devel             /usr/include/ncursesw/nc_tparm.h
ncurses-devel             /usr/include/ncursesw/ncurses.h
ncurses-devel             /usr/include/ncursesw/ncurses_dll.h
ncurses-devel             /usr/include/ncursesw/panel.h
ncurses-devel             /usr/include/ncursesw/term.h
ncurses-devel             /usr/include/ncursesw/term_entry.h
ncurses-devel             /usr/include/ncursesw/termcap.h
ncurses-devel             /usr/include/ncursesw/tic.h
ncurses-devel             /usr/include/ncursesw/unctrl.h
ncurses-devel             /usr/include/term.h
ncurses-devel             /usr/include/termcap.h
ncurses-devel             /usr/lib64/libform.a
ncurses-devel             /usr/lib64/libform.so
ncurses-devel             /usr/lib64/libformw.a
ncurses-devel             /usr/lib64/libformw.so
ncurses-devel             /usr/lib64/libmenu.a
ncurses-devel             /usr/lib64/libmenu.so
ncurses-devel             /usr/lib64/libmenuw.a
ncurses-devel             /usr/lib64/libmenuw.so
ncurses-devel             /usr/lib64/libncurses++.a
ncurses-devel             /usr/lib64/libncurses++.so
ncurses-devel             /usr/lib64/libncurses++w.a
ncurses-devel             /usr/lib64/libncurses++w.so
ncurses-devel             /usr/lib64/libncurses.a
ncurses-devel             /usr/lib64/libncurses.so
ncurses-devel             /usr/lib64/libncursesw.a
ncurses-devel             /usr/lib64/libncursesw.so
ncurses-devel             /usr/lib64/libpanel.a
ncurses-devel             /usr/lib64/libpanel.so
ncurses-devel             /usr/lib64/libpanelw.a
ncurses-devel             /usr/lib64/libpanelw.so
ncurses-devel             /usr/lib64/libtic.a
ncurses-devel             /usr/lib64/libtic.so
ncurses-devel             /usr/lib64/libtinfo.a
ncurses-devel             /usr/lib64/libtinfo.so
ncurses-devel             /usr/lib64/ncurses6
ncurses-devel             /usr/lib64/ncurses6/libform.a
ncurses-devel             /usr/lib64/ncurses6/libform.so
ncurses-devel             /usr/lib64/ncurses6/libformw.a
ncurses-devel             /usr/lib64/ncurses6/libformw.so
ncurses-devel             /usr/lib64/ncurses6/libmenu.a
ncurses-devel             /usr/lib64/ncurses6/libmenu.so
ncurses-devel             /usr/lib64/ncurses6/libmenuw.a
ncurses-devel             /usr/lib64/ncurses6/libmenuw.so
ncurses-devel             /usr/lib64/ncurses6/libncurses++.a
ncurses-devel             /usr/lib64/ncurses6/libncurses++.so
ncurses-devel             /usr/lib64/ncurses6/libncurses++w.a
ncurses-devel             /usr/lib64/ncurses6/libncurses++w.so
ncurses-devel             /usr/lib64/ncurses6/libncurses.a
ncurses-devel             /usr/lib64/ncurses6/libncurses.so
ncurses-devel             /usr/lib64/ncurses6/libncursesw.a
ncurses-devel             /usr/lib64/ncurses6/libncursesw.so
ncurses-devel             /usr/lib64/ncurses6/libpanel.a
ncurses-devel             /usr/lib64/ncurses6/libpanel.so
ncurses-devel             /usr/lib64/ncurses6/libpanelw.a
ncurses-devel             /usr/lib64/ncurses6/libpanelw.so
ncurses-devel             /usr/lib64/ncurses6/libtic.a
ncurses-devel             /usr/lib64/ncurses6/libtic.so
ncurses-devel             /usr/lib64/ncurses6/libtinfo.a
ncurses-devel             /usr/lib64/ncurses6/libtinfo.so
:

How can that be? The ncurses-devel for 5.9 provides ncurses6 parts? But it looks like all of the ncurses pieces I need are installed.](http://tinyurl.com/openSUSE-T-C)*

Okay. Reading the gcc User Guide, I had trouble understanding whether a directory or a file is intended. Sorry 'bout that.

And “-l/usr/lib64/ncurses6” is wrong as well. You should only specify the library name, not the directory. It is automatically searched in the linker search path.

Again, I did not find that clearly stated in the gcc User Guide.

So “-lncurses6” should work.

That sounds reasonable.  But,

$**gcc -lncurses6 -Incurses -Ipanel -o ../obj/example14 example14.c**
example14.c:1:19: fatal error: panel.h: No such file or directory
 #include <panel.h>
                   ^
compilation terminated.

it doesn’t work.

See also “man ld”.

A note though: you should probably use “-lncurses5”, as /usr/include/ncurses/ contains the includes for ncurses5.
The ncurses6 includes are in /usr/include/ncurses6/.
And another hint:
You can use “ncursesX-config” to get the necessary compiler/linker switches.
E.g.:

:~> ncurses5-config --cflags
-I/usr/include/ncurses
:~> ncurses5-config --libs
-lncurses -ltinfo
:~> ncurses5-config --cflags --libs
-I/usr/include/ncurses
-lncurses -ltinfo

For all possible options, see “ncurses5-config --help”.
This should successfully compile your example:

gcc `ncurses5-config --cflags --libs` -o ../obj/example14 example14.c

If you want to compile/link against ncurses6, you should use “ncurses6-config” instead obviously.

  That sounds helpful.  For my development efforts, I prefer to use ncurses6 over  ncurses5.  ncurses5 is installed because it is a prerequisite of other  packages.
   And, here's what comes back from your suggestions:

$**gcc `ncurses6-config --cflags --libs` -o ../obj/example14 example14.c**
/tmp/ccvCibsb.o: In function `main':
example14.c:(.text+0xe6): undefined reference to `new_panel'
example14.c:(.text+0xf6): undefined reference to `new_panel'
example14.c:(.text+0x106): undefined reference to `new_panel'
example14.c:(.text+0x10f): undefined reference to `update_panels'
collect2: error: ld returned 1 exit status
$**gcc `ncurses5-config --cflags --libs` -o ../obj/example14 example14.c**
/tmp/cc6ln4IE.o: In function `main':
example14.c:(.text+0xe6): undefined reference to `new_panel'
example14.c:(.text+0xf6): undefined reference to `new_panel'
example14.c:(.text+0x106): undefined reference to `new_panel'
example14.c:(.text+0x10f): undefined reference to `update_panels'
collect2: error: ld returned 1 exit status

So there’s still something else out of whack here besides my confusion with gcc options. See my response to hendersj earlier in the thread for installed package info as well.

Order of object files matters. Libraries should be specified on command line after objects that reference something in these libraries.

Well, of course not.
You now specified the include path wrongly, so the include files are not found.
Run “ncurses5-config --cflags” or “ncurses6-config --cflags” as I told you to see the correct flags for compiling, and notice the difference:

:~> ncurses5-config --cflags
-I/usr/include/ncurses
:~> ncurses6-config --cflags
-I/usr/include/ncurses6/ncurses -I/usr/include/ncurses6

And to find out which linker flags you need:

:~> ncurses5-config --libs
-lncurses -ltinfo
:~> ncurses6-config --libs
-L/usr/lib64/ncurses6 -lncurses -ltinfo

How should the compiler know where to find the ncurses includes when you specify “-Incurses”? They are not in a folder called “ncurses” in the current directory.
And “-Ipanel” doesn’t make sense at all. You rather wanted “-lpanel” there I suppose.

Again:

  • ‘-I’ adds a directory to the path where include files are searched
  • ‘-L’ adds a directory to the path where linker libraries are searched
  • ‘-l’ links against a specific linker library

That’s not the problem here.
“ncurses-config” doesn’t specify the libpanel that’s used/needed in this particular case/example.

So for compiling/linking against ncurses6, those should work:

gcc -I/usr/include/ncurses6/ncurses -I/usr/include/ncurses6 -o ../obj/example14 example14.c -L/usr/lib64/ncurses6 -lncurses -lpanel
gcc -o ../obj/example14 example14.c `ncurses6-config --cflags --libs`  -lpanel

Oh, and this would work as well, I just tried: :wink:

gcc`ncurses6-config --cflags --libs` -lpanel -o ../obj/example14 example14.c

Yes, all three work (after adding a space after ‘gcc’ on the last one). The last two merely have the options in different order, correct?

Again:

  • ‘-I’ adds a directory to the path where include files are searched
  • ‘-L’ adds a directory to the path where linker libraries are searched
  • ‘-l’ links against a specific linker library

makes everything much clearer.
The issue of placing some flags after the program they refer to is still a bit confusing. They would go after the reference to the source file? Or the reference to the object file?

Yes.
And sorry about the missing space. It somehow got lost during copy/paste… :shame:

The issue of placing some flags after the program they refer to is still a bit confusing. They would go after the reference to the source file? Or the reference to the object file?

Which flags do you mean now?

The order of the flags should not really matter. You could specify all before the “program they refer to”/the source file or after, or interspersed in any way. They are global for that gcc invokation.
But it does matter in which order you specify object files (e.g. xxx.o) for linking.
In short: if x.o uses a symbol from y.o, you have to specify x.o before y.o.