![](/img/trans.png)
[英]How to compile Boost (and link?) libraries in cygwin windows7 i686-w64-mingw32-g++ with bjam
[英]Can't cross compile c++ class with sqlite included (undefined reference) on linux (i686-w64-mingw32-g++)
我試圖用 sqltie3 包含編譯我的 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'
我的生成文件:
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)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.