我有一个项目,其中我使用 sqlite3 库来创建数据库。这些文件如下:
| sqlite3
| shell.c
| sqlite3.c
| sqlite3.h
| sqlite3ext.h
| database.hpp
| database.cpp
| main.cpp
| makefile
在数据库.hpp 文件中,我做#include "sqlite3/sqlite3.h"
.
这是我为这个项目编写的 make 文件:
FLAGS = -g
LIBS = -lsqlite3
CC = g++
executable = a.out
all: $(executable)
$(executable): database.o main.cpp
$(CC) $(FLAGS) $(LIBS) database.o main.cpp -o $(executable)
database.o: database.cpp
$(CC) $(FLAGS) $(LIBS) -c database.cpp -o database.o
.PHONY : clean
clean:
rm $(executable) *.o
问题是这个 makefile 在我的 linux manjaro 计算机中运行得很好,但是当我在使用 ubuntu 的另一台计算机上运行它时,make 会向我发送错误,例如undefined refrence
或者有时在另一个带有 ubuntu 的机器中,它会向我发送can't find -lsqlite3
。
我在这里做错了什么?
提前感谢您的回答
您使用的是系统 SQLite 库,而不是您提供的库。 最简单的解决方案是为sqlite3.o
定义一个新规则,并在可执行文件中依赖它:
CFLAGS = -g
CXXFLAGS += $(CFLAGS)
LDFLAGS = -g
# SQLite needs these libraries.
LIBS = -lpthread -ldl
# see https://sqlite.org/howtocompile.html. I added one option to show how it's done
SQLITE3_OPTIONS = -DSQLITE_ENABLE_JSON1
executable = a.out
all: $(executable)
$(executable): database.o sqlite3.o main.o
$(CXX) $(LDFLAGS) $(LIBS) $^ -o $@
# No rule is necessary for main.o or database.o, these are covered by
# Make's built-in rules
sqlite3.o: sqlite3/sqlite3.c sqlite3/sqlite3.h
$(CC) $(CFLAGS) -Isqlite3 $(SQLITE3_OPTIONS) -c -o $@ $<
.PHONY : clean
clean:
rm $(executable) *.o