Приложение не удалось правильно запустить (0xc000007b) Visual Studio C ++
У меня есть простая программа hello world c ++, которая связывает sqlite3.dll (64-битная версия).
Я правильно добавил sqlite3.h и sqlite3.dll в соответствующие пути. Проекты компилируются для 64-битной архитектуры. Компиляция и компоновка идут нормально.
Проблема возникает, когда я пытаюсь запустить exe.
Я видел много вопросов здесь, которые предлагают использовать ходок зависимости. Я помещаю скриншот здесь:
Я не понимаю, почему это не удается, так как sqlite3.dll находится в папке EXE. И если я хорошо понимаю, ходок зависимости находит это. Арочный столбец x64 для всех.
Исходный код:
#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;
}
Я также использовал следующую утилиту, если exe и dll оба 64-битные:PE Deconstructor
, И оба они в результате будут 64-битными.
РЕДАКТИРОВАТЬ
Я сам скомпилировал sqlite3.dll, следуя инструкциям в
https://www.sqlite.org/howtocompile.html
со следующими инструкциями:
1) загруженvcvars32.bat amd64
2) тогда я записываю в:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64
3) и запустите команду:
cl sqlite3.c -link -dll -out:sqlite3.dll /MACHINE:x64
РЕДАКТИРОВАТЬ 2
Я попробовал официальный sqlite3.dll + sqlite3.def (x64 binaries), преобразованный в sqlite3.lib, с помощью следующей команды:
lib /def:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64
без удачи, та же ошибка.
РЕДАКТИРОВАТЬ 3
Я помещал dll в неправильную папку (VS имеет странное дерево вывода dir с дублированными именами). Сейчас выкладываюофициальный DLL в правильной папкеоно работает.
Мне удалось исправить также мою специально построенную DLL, см. Принятый ответ. Я взял официальный файл sqlite3.def и изменил команду compile, добавив ключ / def. Учитывая тот факт, что def был для более новой версии sqlite, компоновщик жаловался на некоторые недостающие символы. Я удалил эти символы из файла sqlite3.def, и он правильно скомпилировал файл dll, а также создал файлы .lib и .exp. (Теперь нет необходимости в команде lib, поскольку файл lib создается напрямую). Помещение нового dll в правильную папкуработает как шарм.
Пожалуйста, не классифицируйте вопрос как дубликат.
Спасибо