Can';t交叉编译c++;在linux(i686-w64-mingw32-g+;+;+;)上包含sqlite的类(未定义的引用) 我尝试用SqLTiE3包含我的C++类来编译。 我运行Ubuntu 20.04。 为此,我使用了i686-w64-mingw32-g++交叉编译器,我还使用g++对其进行了测试,它可以完美地工作,但不能使用i686-w64-mingw32-g++编译器
我总是会遇到同样的错误:Can';t交叉编译c++;在linux(i686-w64-mingw32-g+;+;+;)上包含sqlite的类(未定义的引用) 我尝试用SqLTiE3包含我的C++类来编译。 我运行Ubuntu 20.04。 为此,我使用了i686-w64-mingw32-g++交叉编译器,我还使用g++对其进行了测试,它可以完美地工作,但不能使用i686-w64-mingw32-g++编译器,c++,linux,sqlite,cross-compiling,C++,Linux,Sqlite,Cross Compiling,我总是会遇到同样的错误: /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' 我的生成文件: mingw
/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'
我的生成文件:
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
这是我的Headerfile(DBWrapper.h):
(抱歉我的英语不好)我想出来了,我只需要sqlite3作为编译器的编译对象文件(sqlite3.o)。我想出来了,我只需要sqlite3作为编译器的编译对象文件(sqlite3.o)
#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();
};
#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_;
}