【问题标题】:Can't cross compile c++ class with sqlite included (undefined reference) on linux (i686-w64-mingw32-g++)无法在 linux (i686-w64-mingw32-g++) 上交叉编译包含 sqlite 的 c++ 类(未定义参考)
【发布时间】:2020-12-31 11:45:22
【问题描述】:

我尝试使用 sqltie3 include 编译我的 c++ 类。
我运行 Ubuntu 20.04。
为此,我使用了 i686-w64-mingw32-g++ 交叉编译器,我还使用 g++ 对其进行了测试,它可以完美运行,但不适用于 i686-w64-mingw32-g++ 编译器。

我总是遇到同样的错误:

/usr/bin/i686-w64-mingw32-ld: DBWrapper.o:DBWrapper.cpp:(.text+0x61): undefined reference to `sqlite3_open'
/usr/bin/i686-w64-mingw32-ld: DBWrapper.o:DBWrapper.cpp:(.text+0x12c): undefined reference to `sqlite3_close'

我的 Makefile:

mingw       = i686-w64-mingw32-g++
SQLCOMPILE  = -I/usr/local/sqlite/include
CFLAGS      = -Wall
SRCFILES    = *.cpp
OBJFILES    = *.o
TARGETWIN   = progwx.exe

all: $(TARGETWIN)

    
$(TARGETWIN): $(OBJFILES)
    $(mingw) $(CFLAGS) $(OBJFILES) $(SQLCOMPILE) -o $(TARGET) -l sqlite3
    
$(OBJFILES): $(SRCFILES)
    $(mingw) $(CFLAGS) $(SQLCOMPILE) -c $(SRCFILES)
    
.PHONY: clean

clean:
    rm -f *.o

我将 sqlite 源代码放在 $(SQLCOMPILE) 中,编译器可以包含所有内容,除非我调用 sqlite3_open() 函数。 我还将源代码编译到了一个库(libsqlite3.a)中,以便 -l 标记可以找到它。
因为如果我不放入 -lsqlite3 标记,g++ 编译器也会带来相同的“未定义引用”错误。

$ i686-w64-mingw32-gcc -c sqlite3.c  
$ ar rcs libsqlite3.a sqlite3.o

这是我的头文件(DBWrapper.h):

#pragma once
#include <string>
#include <stdexcept>
#include <sqlite3.h>

class DBWrapper {
    sqlite3 *db_;
    const int errCode;
public:
    DBWrapper(const std::string &dbname);
    DBWrapper(const DBWrapper&) = delete;
    DBWrapper& operator=(const DBWrapper&) = delete;
    sqlite3* operator*();
    ~DBWrapper();
};

这是我的 CPP 文件 (DBWrapper.cpp):

#include "DBWrapper.h"


DBWrapper::DBWrapper(const std::string &dbname) : db_(nullptr), errCode(sqlite3_open(dbname.c_str(), &db_)){
    if(errCode) {
        throw std::runtime_error("ERROR at opening database!");
    }
}

DBWrapper::~DBWrapper() {
    sqlite3_close(db_);
}

sqlite3* DBWrapper::operator *() {
    return db_;
}

(对不起我的英语不好)

【问题讨论】:

    标签: c++ linux sqlite cross-compiling


    【解决方案1】:

    我发现我只需要 sqlite3 作为编译器的编译目标文件 (sqlite3.o)。

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 2014-07-20
      • 2016-03-11
      相关资源
      最近更新 更多