如何解决无法在Linuxi686-w64-mingw32-g ++上交叉编译包含sqlite未定义参考的c ++类
我试图用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_;
}
(对不起我的英语不好)
解决方法
我发现我只需要sqlite3作为编译器的编译目标文件(sqlite3.o)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。