← Back to team overview

ubuntuforums-unanswered team mailing list archive

[Question #76755]: G++ fails to link specified library

 

New question #76755 on Ubuntu:
https://answers.launchpad.net/ubuntu/+question/76755

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
puposet@Puposet:~/Downloads/pci/pciutils-3.1.3$ 

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

-- 
You received this question notification because you are a member of UF
Unanswered Posts Team, which is an answer contact for Ubuntu.