【问题标题】:Trouble with implementing a basic Makefile in c在 c 中实现基本 Makefile 时遇到问题
【发布时间】: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 工作原理的了解非常少,但这是我的思考过程,

  1. all: orderbook 表示orderbook: 将运行。

  2. orderbook.c 然后将编译,然后代码将编译库。

  3. 编译库后,它将运行:

    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


【解决方案1】:

让我们一步一步来。首先,这是一系列命令,看起来与您的想法相似:

gcc -std=c99 -c list.c -o list.o
ar rcu liblist.a list.o
gcc -std=c99 -c hash.c -o hash.o
ar rcu libhash.a hash.o
gcc -std=c99 -o orderbook order_book.c -L. -llist -lhash -libdefault_hash

不使用 Make 试试这些命令,看看哪些有效(你确定“rcu”不应该是“-rcu”吗?)。通过评论此答案或编辑您的问题告诉我们结果。一旦任何这些命令工作,我们就可以开始编写makefile了。

【讨论】:

  • 除最后一行外,一切正常。错误是skipping incompatible ./libdefault_hash.a when searching for -ldefault_hash 我要重新编辑我的代码现在我有makefile 做我想要的,除了那行代码,或者至少我是这么认为的。
  • 此错误意味着您拥有的 libdefault_hash.a 库对于您正在编译的系统类型无效。它是为不同的架构创建的。例如,您不能获取为 ARM 系统编译的库并在 Intel 系统上使用它。您也不能使用为 32 位 Intel 编译的库并将其与 64 位 Intel 程序链接(反之亦然)。你需要从给你这个库的人那里找出它是为什么目标构建的,并确保你可以为相同的目标编译你的代码。
  • 谢谢你,这肯定是错的。我只需要放-m32!谢谢你的帮助,我真的很感激。
  • @user2856537,现在您的 makefile 正在运行,我们可以对其进行其他改进...
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多