【问题标题】:What is wrong with this Makefile? (header files not found)这个 Makefile 有什么问题? (找不到头文件)
【发布时间】:2012-01-30 13:43:41
【问题描述】:

我正在修改一个旧的 makefile 以便为 postgreSQL 构建一个 C 扩展。 Makefile 目前看起来像这样:

PGLIB = /usr/lib/postgresql/8.4/lib
PQINC = /usr/include/postgresql/8.4/server        
CC=gcc

override CFLAGS+= $(CFLAGS_SL) -DPG_AGGREGATE 

SHLIB = pg_myextlib

SRC =  foo.c \
       foobar.c

OBJS = foo.o \       
       foobar.o

all: $(OBJS)
    $(CC) -shared -o $(SHLIB)$(DLSUFFIX) $(OBJS) -I$(PQINC)
    cp *.so $(PGLIB)

clean:
    rm -f $(SHLIB) $(OBJS) 

我运行 make 时遇到的错误是:

common.h:58:22: 错误:postgres.h: 没有这样的文件或目录

这表明没有添加包含路径(文件存在于 $PQINC 中)。 自从我编写 Makefile 以来已经有很长时间了——从那以后我就没有写过很多了。顺便说一句,我很确定“shared”不是在 Ubuntu(我当前的开发箱)上构建共享库的 gcc 标志——我认为该标志应该是“fPIC”——有人可以确认吗?

我在 Ubuntu 10.0.4 上运行 gcc v4.4.3 并编译以用于 PG 8.4

【问题讨论】:

  • 链接器阶段需要 -shared 来生成共享库。在编译阶段需要 -fPIC 来生成将在共享库中使用的位置无关代码。 (-fPIC 可以添加到 CFLAGS 行)

标签: c postgresql makefile


【解决方案1】:

您似乎正在使用默认规则从 foo.c 构建 foo.o,它没有您的 -I。尝试将以下规则添加到您的 Makefile:

.c.o:
        $(CC) $(CFLAGS) -c $< -o $@ -I$(PQINC)

【讨论】:

  • 或者,您可以将-I$(PQINC) 添加到$(CFLAGS)
【解决方案2】:

尝试将-I$(PQINC) 从目标all 移动到以override CFLAGS 开头的行尾。

【讨论】:

  • +1 用于指出完全该做什么。现在编译成功。我只是想在接受这个答案之前解决当前的链接错误。
【解决方案3】:

-Isomething 放在将object 文件(如$(OBJS) 中的文件)转换为可执行文件的编译器行上不会产生任何影响。

你需要在编译源码文件时这样做。

由于您的 makefile 没有明确显示处理源文件的规则,它很可能使用默认的,这极不可能知道 PQINC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2011-09-10
    • 2013-02-17
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多