sysinfo.h: undefined reference

  • Thread starter Thread starter CrimsonKing
  • Start date Start date
C

CrimsonKing

Guest
Tach,

ich portiere gerade mal wieder. Diesmal eine Anwendung, die die sysinfo.h benötigt.

libsysinfo als Abhängigkeit einzurichten ist kein Problem, aber wie sage ich CMake, wo es nach der sys/sysinfo.h suchen soll? libsysinfo hat die in /usr/local/include/ installiert, aber es findet sie nicht oder kann sie einfach nicht richtig benutzen:

Linking CXX executable nomacs
CMakeFiles/nomacs.dir/src/DkUtils.cpp.o: In function `nmc::DkMemory::getFreeMemory()':
DkUtils.cpp:(.text+0x68): undefined reference to `sysinfo'
CMakeFiles/nomacs.dir/src/DkUtils.cpp.o: In function `nmc::DkMemory::getTotalMemory()':
DkUtils.cpp:(.text+0xc8): undefined reference to `sysinfo'
*** Error code 1

Jemand Erfahrungen?

(Bei Bedarf geb' ich auch gern das Makefile raus.)
 
Er sagt nichts davon, dass er einen Header nicht einbinden kann. Aber keiner der eingebundenen Header enthält eine Funktion Namens sysinfo.
 
Stimmt, ist 'ne struct in der sysinfo.h. Sollte er aber trotzdem kennen?
 
Kann ich dir nicht sagen. Man kann weder den Compileraufruf noch den Code von hier aus erkennen.
 
Die fragliche Funktion ist:

Code:
double DkMemory::getFreeMemory() {

	double mem = -1;
	

#ifdef Q_WS_WIN

	MEMORYSTATUSEX MemoryStatus;

	ZeroMemory(&MemoryStatus, sizeof(MEMORYSTATUSEX));
	MemoryStatus.dwLength = sizeof(MEMORYSTATUSEX);

	if (GlobalMemoryStatusEx(&MemoryStatus)) {
		mem = MemoryStatus.ullAvailPhys;
	}

#elif defined Q_WS_X11

	struct sysinfo info;
	
	if (!sysinfo(&info))
		mem = info.freeram;

#elif defined Q_WS_MAC

	// TODO: could somebody (with a make please add the corresponding calls?

#endif

	// convert to MB
	if (mem > 0)
		mem /= (1024*1024);

	return mem;
}
 
sysinfo.h ist da, wird gefunden und auch in deren Inhalt wird die Deklaration der Funktion sysinfo() gefunden. Das zeigt sich daran, dass es keine Fehler- oder Warnmeldung vom Übersetzer gab.
Das da oben ist eine Fehlermeldung vom Binder, dass er die Definition der Funktion nicht findet. Sprich, die notwendige Bibliothek wurde nicht als Argument beim Binden übergeben: -lsysinfo (evtl. noch -L/usr/local/lib, damit der Binder in dem Verzeichnis nach der Bibliothek sucht).
Header enthalten nur die Deklarationen von Funktionen (modulo inline-Funktionen). Sie sagen so etwas wie: Es gibt eine Funktion mit Namen $NAME, sie hat Parameter mit diesen und jenen Typen und liefert ein Resultat von jenem Typ. Die Implementierung einer Funktion befindet sich in einer Bibliotheksdatei (üblicherweise lib$NAME.a oder lib$NAME.so).
 
Ah, ich war davon ausgegangen, dass die CMAKE-Scripte intelligent genug sind, vorhandene Bibliotheken automatisch zu erkennen. Ich sollte weniger mit Windows arbeiten.

Danke, werde ich nachher mal testen!
 
Scheint zu funktionieren - teilweise:

Linking CXX executable nomacs
/usr/local/lib/libsysinfo.so: undefined reference to `kvm_getprocs'
/usr/local/lib/libsysinfo.so: undefined reference to `kvm_open'
/usr/local/lib/libsysinfo.so: undefined reference to `kvm_close'
/usr/local/lib/libsysinfo.so: undefined reference to `kvm_getswapinfo'
/usr/local/lib/libsysinfo.so: undefined reference to `kvm_getloadavg'
*** Error code 1

Muss ich jetzt eine Abhängigkeit für die Abhängigkeit hinzufügen? :eek: :confused: :grumble:
 
Ja, so funktioniert das. Die korrekten CFLAGS für ihre Abhängigkeiten können sich build-Skripte in der Regel von pkgconf holen:

Für den Compiler:
# pkgconf --cflags glew
-I/usr/include/GL

Für den Linker:
# pkgconf --libs glew
-lGLEW

Edit:
Der Include Pfad oben ist übrigens falsch. Das wäre dann ein bug im graphics/glew port.
 
Dazu dann zwei weitere Fragen:

1. Muss ich die Abhängigkeiten für die sysinfo.h auch in "meinem" oder in "deren" Makefile hinzufügen?
2. Wie finde ich heraus, welche Bilbiothek gern die kvm_-Funktionen hätte?
 
:D Das war jetzt eine sehr spezielle Antwort (danke!). Ich meinte: Wie ermittle ich, welche Funktion in welcher Bibliothek steckt?
 
Dafür gibt es keine generelle Antwort:
- Wenn die Bibliothek gut dokumentiert ist, über die Manpage. Hier z.B. "man kvm_getswapinfo". Leider sind viele Bibliotheken es nicht.
- Google nach dem Symbol fragen. Oft findet man damit schnell, welche Bibliothek es beinhaltet.
- Gefummel mit "strings | grep" auf das Verzeichnis mit den Blibliotheken.
 
Back
Top