G++ fails to link specified library

Asked by Tim Jackson

I have a C++ program written several years ago which uses the pcilib library and was last compiled by g++ in 2006. I am running Jaunty on an amd64, also tried on a 32-bit Celeron with the same result.

Trying to recompile under the current g++, after fixing a few minor issues that changes in the language could reasonably be expected to introduce, such as adding #include<cerrno>, the source compiles, but the link phase gives errors.

puposet@Puposet:~/Documents/Projects/BabyTog/2006software$ make
g++ -o../bin/tog tog.o blue.o ring.o -lpci
blue.o: In function `adc::adc()':
blue.cpp:(.text+0x6e0): undefined reference to `pci_alloc()'
blue.cpp:(.text+0x726): undefined reference to `pci_init(pci_access*)'
blue.cpp:(.text+0x72e): undefined reference to `pci_scan_bus(pci_access*)'
blue.cpp:(.text+0x773): undefined reference to `pci_fill_info(pci_dev*, int)'
blue.cpp:(.text+0x790): undefined reference to `pci_cleanup(pci_access*)'
blue.cpp:(.text+0x7b1): undefined reference to `pci_cleanup(pci_access*)'
blue.o: In function `adc::adc()':
blue.cpp:(.text+0x86c): undefined reference to `pci_alloc()'
blue.cpp:(.text+0x8b2): undefined reference to `pci_init(pci_access*)'
blue.cpp:(.text+0x8ba): undefined reference to `pci_scan_bus(pci_access*)'
blue.cpp:(.text+0x903): undefined reference to `pci_fill_info(pci_dev*, int)'
blue.cpp:(.text+0x920): undefined reference to `pci_cleanup(pci_access*)'
blue.cpp:(.text+0x941): undefined reference to `pci_cleanup(pci_access*)'
collect2: ld returned 1 exit status
make: *** [tog] Error 1

The packages g++, pciutils and libpci-dev are installed and nm shows that /lib/libpci.so does indeed provide the missing routines.

Testing with the simple C pci example provided with the library (but for some reason deleted from the Ubuntu version, which is a shame because it is the only extant documentation of the procedure usage) I find that it comp[iles and runs correctly if compiled with gcc, but produces the same errors if compiled with g++. So:

puposet@Puposet:~/Downloads/pci/pciutils-3.1.3$ gcc -o example example.c -lpci

is OK but

puposet@Puposet:~/Downloads/pci/pciutils-3.1.3$ g++ -o example example.c -lpci
/tmp/ccxOw8m4.o: In function `main':
example.c:(.text+0x1e): undefined reference to `pci_alloc()'
example.c:(.text+0x31): undefined reference to `pci_init(pci_access*)'
example.c:(.text+0x3d): undefined reference to `pci_scan_bus(pci_access*)'
example.c:(.text+0x65): undefined reference to `pci_fill_info(pci_dev*, int)'
example.c:(.text+0x76): undefined reference to `pci_read_byte(pci_dev*, int)'
example.c:(.text+0x178): undefined reference to `pci_lookup_name(pci_access*, char*, int, int, ...)'
example.c:(.text+0x1c0): undefined reference to `pci_cleanup(pci_access*)'
collect2: ld returned 1 exit status

Isn't, although again there is no problem with compilation, it just fails to link.
It looks like some sort of problem with the name mangling.

Tim Jackson

Question information

English Edit question
Ubuntu Edit question
No assignee Edit question
Solved by:
Tim Jackson
Last query:
Last reply:
Revision history for this message
Tim Jackson (tim-tim-jackson) said :

Ok, found it. There was a new header file, which overwrote the one I'd put the "extern C" statement(s) inside of. That will teach me to put the statement in the including file in future, as

extern "C"{

Plus it's been a long time since I wrote it, and memory fades.