声明 ifstream 或 ofstream 变量时LNK1104

LNK1104 when declaring a ifstream or ofstream variable

提问人:Thaval 提问时间:11/13/2023 更新时间:11/13/2023 访问量:50

问:

我尝试使用 ifstream 打开一个文件,但是一旦我尝试声明 ifstream 或 ofstream 变量,我就会得到LNK1104。标头有效,其余代码也有效。

#include "sqlite/sqlite3.h"
#include <string>
#include <stdio.h>
#include <iostream>
#include <fstream>

static int createDB(const char* s);
static int createTable(const char* s);
static int insertData(const char* s);
static int showAllTableEntries(const char* s, std::string table);
static int callback(void* NotUsed, int argc, char** argv, char** azColName);
static int updateData(const char* s, std::string table, int id, std::string toChange, std::string newValue);
static int updateData(const char* s, std::string table, int id, std::string toChange, int newValue);

int main()
{
    const char* dir = "C:\\Meins\\Uebungen\\C++\\TryoutDatabase\\TryoutDatabase\\Tryout2.db";
    sqlite3* DB;

    createDB(dir);
    createTable(dir);


    return 0;
}

static int createDB(const char* s)
{
    sqlite3* DB;
    int exit = 0;
    exit = sqlite3_open(s, &DB);
    sqlite3_close(DB);

    return 0;
}

static int createTable(const char* s)
{
    sqlite3* DB;

    std::string sql_statements;
    /*std::ifstream sql_file; // as soon as i add this line to the code i get the LNK1104
    sql_file.open("C:\\Meins\\Uebungen\\C++\\DatabaseMarketAnalysis\\DataBase\\DB_Setup.sql");

    if (sql_file.is_open()) {
        sql_statements = sql_file.get();
    }*/

    // sql statement
    std::string sql = sql_statements;

    try
    {
        // open the database
        int exit = sqlite3_open(s, &DB);

        char* messageError;

        // execute the statement
        exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messageError);

        if (exit != SQLITE_OK)
        {
            std::cerr << "Error Create Table" << std::endl;
            sqlite3_close(DB);
        }
        else
        {
            std::cout << "Table created successfully" << std::endl;
        }
        sqlite3_close(DB);
    }
    catch (const std::exception & e)
    {
        std::cerr << e.what();
    }

    return 0;
}

我试图将标头更改为 fstream.h 或 .c,因为我认为标头有问题。但是我不知道我还能尝试什么。

C++ 链接器错误 fstream

评论

6赞 Botje 11/13/2023
显示实际错误(输出窗格中的真实错误,而不是错误列表)和完整的编译器命令行。你是如何链接到SQLite的?
2赞 Some programmer dude 11/13/2023
从你的文字来看,你似乎处于学习C++的早期阶段,这意味着你应该花一些时间来学习最基本的基础知识,而不是参与数据库。你不能只是根据猜测来编写代码,而不知道自己在做什么,这不会长期有效。相反,投资一些好的C++书籍并正确学习。
1赞 Thaval 11/13/2023
@Botje Build 已开始...1>------ 生成已启动: 项目: TryoutDatabase, 配置: 调试 x64 ------ 1>TryoutDatabase.cpp 1>C:\Meins\Uebungen\C++\TryoutDatabase\TryoutDatabase\TryoutDatabase.cpp(18,14):警告 C4101:“DB”:未引用的局部变量 1>LINK:致命错误LNK1104:无法打开文件“C:\Meins\Uebungen\C++\TryoutDatabase\x64\Debug\TryoutDatabase.exe”1>完成构建项目“TryoutDatabase.vcxproj” -- 失败。========== 生成:0 个成功,1 个失败,0 个最新,0 个跳过 ============ ========== 生成于 15:33 开始,耗时 01,563 秒 ==========
2赞 Igor Tandetnik 11/13/2023
LNK1104通常意味着以前生成的可执行文件仍在运行,因此链接器无法写入.exe文件。错误消息将告诉您链接器尝试打开但未能打开的文件。
0赞 Thaval 11/13/2023
@Botje 我链接到SQLite是什么意思?

答:

2赞 pts 11/13/2023 #1

删除该文件,然后再次运行生成。C:\Meins\Uebungen\C++\TryoutDatabase\x64\Debug\TryoutDatabase.exe

如果 Windows 不允许您删除该文件,则可能是因为程序 TryoutDatabase.exe 仍在运行。首先通过关闭程序窗口或从任务管理器终止程序。

Microsoft LNK1104文档在这里

评论

0赞 Thaval 11/14/2023
我的文件夹中没有 TryoutDatabase.exe。我试图清理构建并再次运行它,但它也不起作用。
1赞 Thaval 11/14/2023
我发现了问题所在。我的防病毒软件阻止了构建,因为它认为该程序是恶意软件。