【发布时间】:2013-10-20 03:33:36
【问题描述】:
好的,所以我需要为我编写的程序制作一个基本的 Makefile。以下是文件:
list.c
hash.c
order_book.c
libdefault_hash.a //provided already so I do not need to create.
我需要为 list.c 和 hash.c 创建库,以便 orderbook 在编译时可以使用它们。所以这就是我目前在Makefile:
all: orderbook
orderbook: orderbook.c liblist.a libhash.a
gcc -std=c99 -o orderbook order_book.c list.c -L. -llist -lhash -libdefault_hash
liblist.a: list.c
gcc -std=c99 -c list.c
ar rcu liblist.a list.o
libhash.a: hash.c
gcc -std=c99 -c hash.c
ar rcu libhash.a hash.o
我对 makefile 工作原理的了解非常少,但这是我的思考过程,
-
all: orderbook表示orderbook:将运行。 -
orderbook.c然后将编译,然后代码将编译库。 -
编译库后,它将运行:
gcc -std=c99 -o orderbook order_book.c list.c -L. -llist -lhash -libdefault_hash
结果应该是一个名为 orderbook 的简单程序文件,但终端打印出来:
$ make
gcc -std=c99 -o orderbook order_book.c list.c hash.c -L. -llist -lhash -libdefault_hash
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../x86_64-pc-linux-gnu/bin/ld: skipping incompatible ./liblist.a when searching for -llist
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -llist
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -libdefault_hash
collect2: ld returned 1 exit status
make: *** [orderbook] Error 1
$
非常感谢任何帮助/指导。
【问题讨论】:
-
nitpick:makefile 本身不包含任何 C 代码;你只是碰巧用它来编译用 C 写的 else 的东西。
-
为什么 Make 不尝试在可执行文件之前构建库?我猜:您在上一步中构建了库,您没有向我们展示。为什么
list.c出现在同时调用liblist.a的编译器命令中?我再猜测一下:您还没有从命令行获得该命令。 您必须知道如何构建文件,然后才能告诉 Make 如何构建它。 -
注意:您可能希望在执行此操作时使用 -ldefault_hash。与您的其他库相比,命名法似乎有点不正确。自从我这样做以来已经有一段时间了,做ymmv。并且有相当简单的方法可以做到这一点。并且
list.c不应出现在orderbook的编译行上;它已经在liblist.a -
@Beta,我想先做库,但不知道怎么做。会不会是:
orderbook: liblist.a libhash.a orderbook.c?此外,我并不是要将 list.c 放在编译器命令中,但不把它放在那里是有意义的。
标签: c gcc compiler-errors makefile libraries