Gå til innhold

COFF symbol table


Anbefalte innlegg

Jeg driver egentlig og pusler med et lite fint prosjekt med en CGI-gjestebok laget i C++, men støtte på et par grusomme feil... P.G.A dette lagde jeg en liten kode som bruker de samme elementene, og jada; feilen kommer der også:

 

#include <iostream>
#include "cgic.h"
using namespace std;

int cgiMain(){
cgiHeaderContentType("text/html");
cout<<"<HTML>\n";
cout<<"<HEAD><TITLE>HEH...</TITLE></HEAD>\n";
cout<<"<BODY>\n";
cout<<"Heiåhå!!!!:-)\n";
cout<<"</BODY>\n";
cout<<"</HTML>\n";
return 0;
}

 

denne burde jo være grei å kompilere, men den får akkurat samme feilen som i gjesteboka:

fatal error LNK1254: metadata for symbol '?cgiMain@@$$J0YAHXZ' inconsistent with COFF symbol table

Jeg har prøvd å inkludere cgic.c i stedet for cgic.h, og får bare flere merkeligere feil.

I gjesteboka får jeg feilen i cgiHeaderContentType også, men hvis jeg fjerner den kommer feilen i cgiMain...

Jeg har satt opp filer i vanlig c til å kompileres som det også...

Jeg bruker VS.NET, men har fått samme feil i DevCpp(bloodshed).

Feilen skjer under linking...

Endret av Zethyr
Lenke til kommentar
Videoannonse
Annonse

Jeg kjenner ikke så godt til feilmeldingene under VC.

 

Kunne du gitt den tilsvarende meldingen du får i DevCpp (MinGW)?

 

Sånn med det første vil jeg tippe at du må linke med et eller annet cgi-bibliotek du har lastet ned. Altså du får feilen fordi du ikke linker med dette biblioteket.

Lenke til kommentar

Her er det sannsynligvis noe tull med blanding av C og C++ og bruken av extern keyword.

 

Mitt forslag er å rename C filene (går ut fra at det er et C bibliotek) fra *.c til *.cpp. Filene blir da kompilert med C++ kompilatoren og ikke C komplatoren. Tipper problemene dine forsvinner da :)

 

En annen løsning er å gå gjennom header filen(e) (cgic.h) og legge til:

#ifdef __cplusplus
extern "C" XXXXXXX
#else
extern XXXXXXX
#endif

 

...for alle forekomster av extern. Samtidig må du sannsynligvis skrive cgiMain slik:

extern "C" int cgiMain()
{
//.....
}

Endret av kjetil7
Lenke til kommentar

Jeg er på skolen nå, men skal prøve når jeg kommer hjem... det er en ganske lik feilmelding i DevCpp... filene fulgte med i PC-Pro for en stund siden, men det skulle ligge på boutell.com... Jeg kan jo prøve å se om det er noen biblioteker der, men det fulgte ikke med noen i PCPro... I PCPro hadde de kompilert kode med bare å si fra at c-filene skulle kompileres med c-kompilatoren... jeg skal prøve å rename filene også når jeg kommer hjem...

kan noen av dere bare si fra om det går bra å kompilere det uten å modifisere koden og filnavenene i noen andre kompilatorer??

takker for alle svar...

Lenke til kommentar

Etter å ha sett på biblioteket som ligger på http://www.boutell.com/ kan jeg bekrefte at det er blanding av C++ og C som er problemet.

 

Det som skjer er at main() som du finner i cgic.c kaller cgiMain(). I ditt tilfelle kaller da C funksjonen main() C++ funksjonen cgiMain(). Dette vil ikke fungere hvis du ikke deklarerer cgiMain() som extern "C".

 

Samtdig må du legge til extern "C" i #ifdef __cplusplus blokker slik jeg beskrev i min forrige post. Her er et par eksempel fra headeren:

 

#ifdef __cplusplus
extern "C" void cgiHeaderLocation(char *redirectUrl);
extern "C" void cgiHeaderStatus(int status, char *statusMessage);
extern "C" void cgiHeaderContentType(char *mimeType);
#else
extern void cgiHeaderLocation(char *redirectUrl);
extern void cgiHeaderStatus(int status, char *statusMessage);
extern void cgiHeaderContentType(char *mimeType);
#endif

/* ........  */

#ifdef __cplusplus
extern "C" int cgiMain();
#else
extern int cgiMain();
#endif

 

..men den enkleste løsningen er som sagt å gi alle C filene cpp extension.

Endret av kjetil7
Lenke til kommentar

Vel, jeg har klart å reprodusere feilen din og bruker filene fra http://www.boutell.com/cgic/ som er de samme som du bruker. Å gi cgic.c nytt navn til cgic.cpp løser problemene. Det skal det gjøre. Jeg har fått begge løsningene som jeg skisserte til å fungere uten noen som helst problemer.

 

Du kan prøve å kjøre 'clean' og 'rebuild' (eller bruke c++ biblioteket som kanskje er den beste løsningen :) )

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...