La aplicación no pudo iniciarse correctamente (0xc000007b) Visual Studio C ++
Tengo un simple programa hello world c ++ que vincula sqlite3.dll (versión de 64 bits).
He agregado sqlite3.h y sqlite3.dll correctamente en las rutas respectivas. Los proyectos compilan para la arquitectura de 64 bits. La compilación y la vinculación van bien.
El problema surge cuando intento ejecutar el exe.
He visto muchas preguntas aquí que sugieren usar el caminante de dependencia. Estoy poniendo la captura de pantalla aquí:
No entiendo por qué falla ya que sqlite3.dll está en la carpeta del exe. Y si entiendo bien, la dependencia Walker lo encuentra. La columna de arco es x64 para todos.
El código fuente:
#include <iostream>
#include "sqlite3.h"
int main()
{
std::cout<< "Hello world and all that" << std::endl;
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
sqlite3_close(db);
return 0;
}
También he usado la siguiente utilidad si el exe y el dll son de 64 bits:PE Deconstructor
. Y ambos resultan ser de 64 bits.
EDITAR
He compilado sqlite3.dll por mí mismo siguiendo las instrucciones en
https://www.sqlite.org/howtocompile.html
con las siguientes instrucciones:
1) cargadovcvars32.bat amd64
2) luego cd en:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64
3) e inicie el comando:
cl sqlite3.c -link -dll -out:sqlite3.dll /MACHINE:x64
EDITAR 2
Probé el sqlite3.dll oficial + sqlite3.def (binarios x64) convertido a sqlite3.lib con el siguiente comando:
lib /def:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64
Sin suerte, el mismo error.
EDITAR 3
Estaba poniendo el dll en la carpeta incorrecta (VS tiene un árbol de directorios de salida extraño con nombres duplicados). Ahora poniendo eloficial dll en la carpeta correctafunciona.
Logré arreglar también mi dll personalizado, vea la respuesta aceptada. Tomé el archivo oficial sqlite3.def y modifiqué el comando de compilación agregando el modificador / def. Dado que la definición era para una versión más nueva de sqlite, el enlazador se quejó de algunos símbolos faltantes. Eliminé esos símbolos del archivo sqlite3.def y compiló correctamente el archivo dll y también produjo archivos .lib y .exp. (No hay necesidad del comando lib ahora ya que el archivo lib se crea directamente). Poner el nuevo dll en la carpeta correctaFunciona de maravilla.
No clasifique la pregunta como duplicada.
Gracias