undefined reference nach Aufruf einer externen Bibliothek

JeFi

Grünschnabel
Hallo,

ich möchte gerne auf eine Datenbank(Gupta SQL Base) via C++ zugreifen. Im Installatinsverzeichnis meiner DB liegen auch ein include-Verzeichnis(welches Header beinhaltet, mit denen ich dann auf die DB zugreifen kann) und ein lib-Verzeichnis.

Nun mein Problem, wenn ich mein Programm kompilieren möchte erhalte ich die folgende Fehlermeldung:

main.cpp: undefined reference to `sqlcnc'
main.cpp: undefined reference to `sqldis'

Woran kann das liegen?(kann er die Implementierung der Funktionen nicht finden? Wenn ja wie kann ich ihm die zuweisen? Die Header und Lib´s sind in den Umgebungsvar´s angegeben!)



Mein Quellcode sieht wie folgt aus: (habe im include den gesamten Pfad angegeben, weil es glaube mehrere sql.h gibt)
Code:
#include <stdio.h>
#include <iostream>
#include <string>
#include <C:\\Programme\\Gupta\\SQLBase90\\include\\sql.h> 

using namespace std;

int main(){
	
	SQLTCUR cur=0; /* SQLBase cursor number*/
	SQLTRCD rcd=0; /* return code */
	static unsigned char dbname[]="testdb/user/pw";
	
	/*
	CONNECT TO THE DATABASE
	*/
	if (rcd = sqlcnc(&cur,dbname,0)){
		printf("FAILURE ON CONNECT %d\n",rcd);
		printf("Does the PAYROLL database exist?\n");
		printf("Has GRANT.SQL been run\n");
		return (1);
	}else
		printf("Connection Established \n");
	
	if (rcd = sqldis(cur))
		printf("FAILURE ON DISCONNECT %d\n", rcd);
	else 
		printf("Disconnect Performed \n");
		
	
	return 0;
}


Hoffe mir kann jemand helfen.
 
Moin, die Fehlermeldung "main.cpp: undefined reference to `sqlcnc'" zeugt davon, dass beim Kompiliervorgang die Bibliothek(en) der Datenbank nicht mit eingebunden wurde(n).

Entsprechend dazu musst Du also die Optionen des Kompilers anpassen
 
Hallo Andy,

danke für die schnelle Antwort. Ich dachte, wenn ich die Lib´s in den Umgebungsvar´s angegebe reicht das aus.

Habe es nun nochmal so probiert: (wie man erkennt nutze ich g++)

g++ -IC:\Programme\Gupta\SQLBase90\include -LC:\Programme\Gupta\SQLBase90\lib main.cpp
 
Der Aufruf ist so schon richtig, Du musst aber noch eine oder mehrere Bibliotheken hinzufügen, die zur Datenbank gehören. Bisher hast Du nur den Include-Pfad angegeben und den Pfad für die Bibliotheken ...esweiteren solltest Du ein "-o rammname" hinzufügen, um dem Kind (der Anwendung) einen Namen zu geben. Als Hinweis: die Option "-Wall" veranlasst den Kompiler, Warnmeldungen auszugeben, falls der Code unsauber ist
 
Du musst aber noch eine oder mehrere Bibliotheken hinzufügen

Wie mache ich das denn?(-L und Pfad oder?) Ich dachte in dem Libverzeichnis sind bereits alle Bibliotheken vorhanden. Habe jetzt noch alle Pfade in denen ich dll´s gefunden habe hinzugefügt. Die Fehlermeldung ist allerdings die selbe.

g++ -IC:\Programme\Gupta\SQLBase90\include -LC:\Programme\Gupta\SQLBase90 -LC:\Programme\Gupta\SQLBase90\lib -LC:\P
rogramme\Gupta\SQLBase90\sqlconsole -LC:\Programme\Gupta\SQLBase90\_jvm\bin -Wall -o test main.cpp
 
die Frage ist, ob sich dort im Bibliotheks-Verz.DLL's befinden, "*.so"-Files oder statisch gelinkte *.a - Files. Das macht es nämlich unterschiedich, wie die Bibliotheken hinzugelinkt werden. für den Fall, dass es "*.so"-Files sind, muss der weitere Kompiler-Aufruf "-lbibliothek.so" (minus-kleines-L ohne Freizeichen+Bibliothekname ohne "lib") heissen,für den Fall, dass es *a-Files sind, muss im g++ der Befehl ar bzw ranlib vorhanden sein, wenn es DLL's sind, kann ich leider keine Auskunft geben, da ich nur unter Linux programmiere. Für den Fall würde ich empfehlen, Google zu nutzen, wie man unter winows DLL's beim GCC/G++ einbindet.
 
Hallo und Danke für deine Hilfe.

Habe es jetzt endlich hinbekommen :) .


g++ -IC:\Programme\Gupta\SQLBase90\include -LC:\Programme\Gupta\SQLBase90 -lsqlwntm -o test main.cpp
 
Zurück