Не запускается скомпилированный файл C++ на macOS из Finder
Всем привет ! Я работаю на MacOS Sonoma 14.4 (MacBook Air M2). Использую Visual Studio Code. Код написан на C++ с использованием "sqlite3.h".
#include <iostream>
#include <string>
#include "sqlite3.h"
using namespace std;
// Callback функция для обработки результатов запроса
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
// argc - количество столбцов в результате
// argv - массив значений полей
// azColName - массив имен столбцов
for(int i = 0; i < argc; i++) {
cout << azColName[i] << ": " << (argv[i] ? argv[i] : "NULL") << endl;
}
cout << endl;
return 0;
}
int main() {
sqlite3 *DB;
int check = 0;
const char* dbPath = "DataBase.db";
check = sqlite3_open(dbPath, &DB);
// Проверка на открытие базы
if (check != SQLITE_OK) {
cerr << sqlite3_errmsg(DB) << endl;
sqlite3_close(DB);
return -1;
}
else {
cout << "Base was opened !" << endl;
cout << "_ _ _ _ _ _ _ _ _" << endl;
cout << endl;
}
char *err_message = 0;
const char *sql_showTable = "SELECT * FROM Books";
check = sqlite3_exec(DB, sql_showTable, callback, NULL, &err_message);
// Проверка на успешное выполнение запроса
if (check != SQLITE_OK) {
cerr << sqlite3_errmsg(DB) << endl;
sqlite3_free(err_message); // Освобождение памяти
sqlite3_close(DB);
return -1;
}
sqlite3_close(DB);
return 0;
}
1: Подключение к базе данных: Программа пытается открыть базу данных DataBase.db. Если база данных не может быть открыта (например, из-за ошибки доступа или если файл базы данных не существует), программа выводит сообщение об ошибке и завершается с ошибкой.
2: Вывод содержимого таблицы: Если соединение с базой данных успешно установлено, программа выполняет SQL-запрос SELECT * FROM Books, который выбирает все записи из таблицы Books. Для обработки и вывода результатов запроса используется callback-функция callback. Эта функция перебирает все строки результатов запроса, выводя значения каждого столбца в консоль. Для каждой строки выводятся имена столбцов и соответствующие значения полей, причем для пустых полей выводится "NULL".
3: Обработка ошибок: Если при выполнении SQL-запроса происходит ошибка (например, если таблицы Books не существует), программа выводит сообщение об ошибке, освобождает выделенную память для сообщения об ошибке и закрывает соединение с базой данных, после чего завершается с ошибкой.
4: Закрытие соединения с базой данных: После успешного выполнения запроса или в случае возникновения ошибки соединение с базой данных закрывается.
У меня все файлы находятся сейчас в папке Book_DatabaseNew. В папке Book_DatabaseNew есть файлы: DataBase.db; main.cpp; main и main.dSYM. Если я запускаю файл через терминал и использую cd - например: открыл терминал, написал cd /Users/dmitry/Documents/Program_Language_Folder/CppProj/Book_DatabaseNew и затем прописываю команду .main, то всё отлично работает. Если я просто перехожу через Finder в папку Book_DatabaseNew и пытаюсь запустить файл main (двойным нажатием), то в терминале выводится:
Base was opened !
_ _ _ _ _ _ _ _ _
no such table: Books
Saving session...completed.
Я даже пытался написать скрипт через automator или через .sh по типу:
#!/bin/bash
cd "$(dirname "$0")"
./main
upd: через pwd тоже пробовал. Но даже в этом случае программа не срабатывает. Кстати если запустить скрипт в котором будет прописано что-то по типу такого:
FILENAME="example.txt"
echo "Пример текста, который будет записан в файл." > "$FILENAME"
echo "Файл '$FILENAME' был успешно создан и в него был записан текст."
..то файл создаётся в каталоге ~ , что опять же странно, ибо скрипт запущен из каталога Book_DatabaseNew. Я не понимаю как это пофиксить ? Я просто хочу запускать файл через ярлык, но это не срабатывает. Я испробовал разные способы, но не нашёл решения. Почему так происходит ? Как в итоге создать рабочий ярлык с программой, которую я могу запустить ? !! Я буду скачивать эту программу на другой компьютер, по-этому абсолютный путь к бд в самом коде меня не устраивает, хотя это срабатывает !!
Как дополнение мой файл tasks.json:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ сборка активного файла",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-lsqlite3"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Задача создана отладчиком."
}
],
"version": "2.0.0"
}