【问题标题】:Making a library before the final executable using makefile使用 makefile 在最终可执行文件之前创建一个库
【发布时间】:2015-08-24 22:08:56
【问题描述】:

我有以下生成文件

all: yesdata

CFLAGS=-fPIC

lex.yy.c: yesdata.l yesdata.tab.h
        flex yesdata.l

yesdata.tab.c yesdata.tab.h:    yesdata.y
        bison -d yesdata.y

yesdata: lex.yy.c yesdata.tab.c yesdata.tab.h yesdata_util.c
        gcc $(CFLAGS) -o yesdata yesdata.tab.c yesdata_util.c lex.yy.c -lyesdata -lyesprocess -ltest -ltestconf 

clean:
        rm yesdata yesdata.tab.c lex.yy.c yesdata.tab.h    

我的lex 文件是yesdata.l

我的 yacc 文件是yesdata.y

我有一个 C 文件,其中包含一些函数 yesdata_util.c

上面的makefile 将其编译成一个名为yesdata 的二进制文件。

现在main() 入口函数在yesdata.y 中定义。我想将 main() 移动到另一个 C 文件,比如 abcdef.c

我想编译 abcdef.c 并将该 C 文件链接到文件 yesdata.l,yesdata.yyesdata_util.c.

如何使用 makefile 实现这一点?

【问题讨论】:

  • 强烈建议修改makefile,使每个.c文件单独编译,链接步骤是单独的(并且取决于.c文件编译步骤中的目标文件。
  • 您是特别想与词法分析器和解析器创建一个共享库(以便将它们与多个程序链接),还是只想将它们编译为与包含 main 的文件不同的目标文件然后将所有内容联系在一起?因为如果是后者,您可以执行类似yesdata: yesdata.tab.o lex.yy.o main.o $(CC) $^ -o $@ 之类的操作。您已经拥有的规则将创建 yesdata.tab.o 和 lex.yy.o,默认规则将用于将它们编译为目标文件,然后通过上述行链接。

标签: c++ c makefile


【解决方案1】:

'-fPIC' 将生成库文件, 所以'-o'参数不仅应该表示库的名称, 还要放置该库的位置。

abcdef.c文件的编译应该是一个单独的步骤,

abcdef.o 文件到 abcdef 可执行文件的链接需要“-l”参数来让链接步骤知道库。

由于库已经生成, abcdef.c 文件的处理不需要了解用于生成库的文件的任何信息。
但是,将 abcdef.c 转换为 abcdef.o 确实需要依赖于包含该库的原型等的 .h 文件

【讨论】:

  • -fPIC 生成与位置无关的代码,这是共享库的要求,但它本身并不生成库(请参阅-shared)。对于静态库,您不需要它,但需要在单独的步骤中创建库存档ar rcs *.o
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多