【问题标题】:How to link C libraries in makefile如何在makefile中链接C库
【发布时间】:2016-11-18 20:44:23
【问题描述】:

我正在处理现有的 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。

【问题讨论】:

  • LDFLAGS后面加-lsqlite3不行吗?
  • “我尝试了几件事,但没有任何效果。”。你到底尝试了什么?如果您不告诉我们,我们怎么能告诉您您可能做错了什么?

标签: c makefile sqlite


【解决方案1】:

如果您要链接到动态 (*.so) 库,您应该更改原始 make 文件。特别是,您应该将 LDFLAGS 行更改为如下所示:

LDFLAGS = -lxml2 -lpthread -lm -lz -lsqlite3

【讨论】:

    【解决方案2】:

    如果我理解正确,您想将该 Makefile 用作模板。这个简单的命令有点过大,但如果你想这样做:

    有问题的行是

    LDFLAGS = ...
    

    -lz 后面添加您的-lsqlite3。如果您真的只想构建您的 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/*.c 构建模式obj/*.o 的任何文件。$(CC) 和$(CFLAGS) 被替换为上面定义的内容。$

    请允许我给您一个建议:您最好阅读 Makefile 教程以了解其逻辑。无论如何都很难调试 Makefile,但如果人们不知道它不是对过程的描述,而是对一组规则的定义,那几乎是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多