我正在处理已经存在的C代码,现在我已经在C中使用sqlite创建了一个数据库。该程序运行良好。但是现在我需要为它创建一个makefile。我使用
编译了程序gcc cliDemo.c -l sqlite3
但是现在因为我使用的是makefile,我需要把它放在makefile中。我尝试了几件事,但没有任何效果。
EXEC = telescope
CC = gcc
CFLAGS = -Wall -fno-strict-aliasing -g -I/usr/include/libxml2 -DHAVE_CONFIG_H
LDFLAGS = -lxml2 -lpthread -lm -lz
AR = @AR@
ARFLAGS = @ARFLAGS@
RANLIB = @RANLIB@
INSTALL_MODE= -m 0755
# Include some boilerplate Gnu makefile definitions.
prefix = /usr/local
exec_prefix = ${prefix}
bindir = ${exec_prefix}/bin
libdir = ${exec_prefix}/lib
infodir = ${prefix}/share/info
includedir = ${prefix}/include
datadir = ${prefix}/share
docdir = $(datadir)/doc/telescope
localedir = $(datadir)/locale
mandir = ${prefix}/share/man
manpfx = man
man1ext = .1
man1dir = $(mandir)/$(manpfx)1man3ext = .3man3dir = $(mandir)/$(manpfx)3
htmldir = ${docdir}
SRCDIR = ./src
BINDIR = ./bin
OBJECTDIR = ./Obj
MAINOBJS = $(OBJECTDIR)/telescope.o
MAINEXEC = $(BINDIR)/telescope
OBJECTS1 = $(MAINOBJS)
all: $(EXEC)
$(EXEC): $(OBJECTS1)
$(CC) $(CFLAGS) $(OBJECTS1) $(LDFLAGS) -o $(MAINEXEC)
$(OBJECTDIR)/telescope.o: $(SRCDIR)/telescope.c
$(CC) $(CFLAGS) -c $(SRCDIR)/telescope.c -o $(OBJECTDIR)/telescope.o
clean:
rm -f $(EXEC) $(MAINEXEC) $(OBJECTS1)
# build tests
build-tests: .build-tests-post
.build-tests-pre:
# Add your pre 'build-tests' code here...
.build-tests-post: .build-tests-impl
# Add your post 'build-tests' code here...
# run tests
test: .test-post
.test-pre:
# Add your pre 'test' code here...
.test-post: .test-impl
# Add your post 'test' code here...
这是makefile中的代码。我不明白如何在这里链接sqlite3。
答案 0 :(得分:1)
如果要链接动态(* .so)库,则应更改原始make文件。特别是,您应该将LDFLAGS
行更改为如下所示:
LDFLAGS = -lxml2 -lpthread -lm -lz -lsqlite3
答案 1 :(得分:0)
如果我理解正确,您希望将该Makefile用作模板。对于这个简单的命令,它有点过大,但如果你想这样做:
有问题的行是
LDFLAGS = ...
将-lsqlite3
添加到-lz
后面。如果你真的只想构建你的cliDemo,那么你想删除CFLAGS =
和LDFLAGS =
后面的所有其他东西,因为这些变量用于构建你的命令行。
将telescope
替换为cliDemo
,并将您的cliDemo.c放入src
目录。
另外,我认为Makefile规则
$(OBJECTDIR)/telescope.o: $(SRCDIR)/telescope.c
$(CC) $(CFLAGS) -c $(SRCDIR)/telescope.c -o $(OBJECTDIR)/telescope.o
应替换为通用规则:
$(OBJECTDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
这意味着“您可以通过执行以下行从obj/*.o
构建模式obj/*.c
的任何文件。$(CC)和$(CFLAGS)将替换为上面定义的内容。$&lt ;替换为冒号右侧的文件名,$ @替换为左侧的文件名。确保第二行缩进时使用实际制表符而不是空格。
请允许我给你一个建议:可能你最好阅读一个Makefile教程来理解逻辑。无论如何都很难调试Makefile,但如果不知道它不是程序的描述,而是一组规则的定义,那么几乎是不可能的。