Problem mit Embedded SQL (PostgreSQL) in Visual C++ 6.0

XesperantoX

Mitglied
Hallo,

also ich habe ein Problem mit einem Embedded SQL Code und zwar habe ich eine kleine PostgreSQL Datenbank erstellt und möchte/muss nun über ein C-Programm auf die DB zugreifen. Soweit sogut... um das Ganze zu testen habe ich erstmal nur soweit geschrieben das die DB geöffnet, ein kurzer Text ausgegeben wird und die DB dann wieder geschlossen wird.
Den C-Code habe ich dann mit "ecpg" kompiliert und habe dann auch meine .c-Datei erhalten. Bis hierhin alles okay, aber wenn ich die Datei jetzt in Visual C++ 6.0 öffne und dort kompilieren bzw ausführen will bekomme ich folgende Fehler gemeldet:

Code:
--------------------Konfiguration: EmbeddedC - Win32 Debug--------------------
Linker-Vorgang läuft...
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _ECPGdisconnect
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _sqlprint
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _ECPGget_sqlca
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _ECPGconnect
Debug/EmbeddedC.exe : fatal error LNK1120: 4 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

EmbeddedC.exe - 5 Fehler, 0 Warnung(en)

Bei den Fehlern handelt es sich ja um unbekannte Funktionsaufrufe, also schließe ich daraus das Libaries und Include-Files fehlen. Habe inzwischen angefangen .dll und .lib Dateien aus den Postgre-Verzeichnis zu kopieren, aber irgendwie muss das ganze doch auch anders gehen, bzw an was anderem liegen...

Die von ecpg kompilierte Datei sieht folgendermaßen aus:
Code:
/* Processed by ecpg (4.1.1) */
/* These include files are added by the preprocessor */
#include "c:\Programme\postgreSQL\8.1\include\ecpgtype.h"
#include "c:\Programme\postgreSQL\8.1\include\ecpglib.h"
#include "c:\Programme\postgreSQL\8.1\include\ecpgerrno.h"
#include "c:\Programme\postgreSQL\8.1\include\sqlca.h"
/* End of automatic include section */
#line 1 "c:\main.pgc"
#include <stdio.h>
#include <stdlib.h>

/* exec sql begin declare section */
/* exec sql end declare section */
#line 5 "c:\main.pgc"


#line 1 "C:/Programme/PostgreSQL/8.1/include/sqlca.h"
#ifndef POSTGRES_SQLCA_H
#define POSTGRES_SQLCA_H

#ifndef DLLIMPORT
#if  defined(WIN32) || defined(__CYGWIN__)
#define DLLIMPORT __declspec (dllimport)
#else
#define DLLIMPORT
#endif   /* __CYGWIN__ */
#endif   /* DLLIMPORT */

#define SQLERRMC_LEN	70

#ifdef __cplusplus
extern		"C"
{
#endif

struct sqlca_t
{
	char		sqlcaid[8];
	long		sqlabc;
	long		sqlcode;
	struct
	{
		int			sqlerrml;
		char		sqlerrmc[SQLERRMC_LEN];
	}			sqlerrm;
	char		sqlerrp[8];
	long		sqlerrd[6];
	/* Element 0: empty						*/
	/* 1: OID of processed tuple if applicable			*/
	/* 2: number of rows processed				*/
	/* after an INSERT, UPDATE or				*/
	/* DELETE statement					*/
	/* 3: empty						*/
	/* 4: empty						*/
	/* 5: empty						*/
	char		sqlwarn[8];
	/* Element 0: set to 'W' if at least one other is 'W'	*/
	/* 1: if 'W' at least one character string		*/
	/* value was truncated when it was			*/
	/* stored into a host variable.				*/

	/*
	 * 2: if 'W' a (hopefully) non-fatal notice occurred
	 */	/* 3: empty */
	/* 4: empty						*/
	/* 5: empty						*/
	/* 6: empty						*/
	/* 7: empty						*/

	char		sqlstate[5];
};

struct sqlca_t *ECPGget_sqlca(void);

#ifndef POSTGRES_ECPG_INTERNAL
#define sqlca (*ECPGget_sqlca())
#endif

#ifdef __cplusplus
}
#endif

#endif

#line 6 "c:\main.pgc"

/* exec sql whenever sqlerror  sqlprint ; */

#line 7 "c:\main.pgc"


int main(int argc, char *argv[])
{
  /* exec sql begin declare section */
  /* exec sql end declare section */
#line 12 "c:\main.pgc"

  
  { ECPGconnect(__LINE__, 0, "olympia" , NULL,NULL , NULL, 0); 
#line 14 "c:\main.pgc"

if (sqlca.sqlcode < 0) sqlprint();}
#line 14 "c:\main.pgc"

  
       printf("Mit DB Olympia verbunden!");
       
  { ECPGdisconnect(__LINE__, "CURRENT");
#line 18 "c:\main.pgc"

if (sqlca.sqlcode < 0) sqlprint();}
#line 18 "c:\main.pgc"

       
  system("PAUSE");	
  return 0;
}

Wäre dankbar wenn mir jemand einen Tipp geben könnte!

Grüße
Esperanto
 
Hi,
Ursache ist, daß der Linker eine Lib nicht findet. Welche das ist, mußt du selbst herausfinden. Dann entweder in das Lib-Verzeichnis deiner IDE kopieren oder in den Einstellungen dem Linker den zusätzliche Pfad übergeben.

Mfg

langer
 
Hallo,

okay danke hat soweit geklappt. Hab die beiden benötigten Libaries als Pfad angegeben. Musste mir aber zusätzlich noch eine Reihe von DLLs ins Projekt-Verzeichnis kopieren (hab sie dahin kopiert damit ich weiß welche es sind) bis es lief.
Gibt's evtl. die Möglichkeit diese DLLs dem Visual C++ dauerhaft zur Verfügung zu stellen oder sie über einen Header einzubinden? sonst müsst ich sie, denke ich bei jedem neuen Projekt wieder kopieren und das ist ja schon etwas lästig...

Grüße
Sascha
 
Hmm, bei VS 2003 kann man in den Projekteinstellungen bei Linker zusätzliche Pfade angeben. Bei VC 6 müßte das prinzipiell auch gehen. Mußt mal bei den Optionen oder Projekteinstellungen schauen.

Mfg

langer
 
Zurück