在linux上为C程序制作一个makefile

时间:2014-12-06 08:44:03

标签: c makefile

我有一个C编程练习,我在Windows上的Visual Studio中编写(并且运行完美)。我现在必须确保它在Linux上运行正常,并且需要为它创建一个makefile(它是赋值的一部分)。这是我的makefile:

all: genericdfs.a sudSolver

genericdfs.a: genericdfs.c genericdfs.h
    gcc -Wvla -c genericdfs.c
    ar rs genericdfs.a genericdfs.c

sudSolver.o: sudSolver.c sudTree.h genericdfs.h
    gcc -Wvla -c sudSolver.c    -lm

sudukutree.o: sudTree.c sudTree.h
    gcc -c sudTree.c -lm

sudSolver: sudSolver.o sudTree.o genericdfs.a
    gcc -Wvla sudSolver.o sudTree.o -L. -lgenericdfs -o sudukusolver -lm

clean:
    rm -f sudSolver.o
    rm -f sudTree.o
    rm -f genericfs.o

好的,所以主C文件是sudSolver,它包含了sudTree.h和math.h(因此是-lm)

sudTree.c也包括sudTree.h和genericdfs.h。

其中一个要求是创建一个.a库,该库应该在链接操作时链接到主C文件。

我们几乎没有解释如何编写这些makefile,所以我上面写的都是根据我在网上找到的makefile教程。

然而,这个makefile不起作用,与库的链接似乎有问题,因为这是返回的错误:

  

找不到找不到-lgenericdfs

我尝试改变一切,但似乎没有任何效果,当我把-L出现时出现了另一个错误。关联行中的genericfs.a:

  

genericdfs.a:错误添加符号:存档没有索引;运行ranlib添加一个

有人可以解释我如何链接到创建的.a库吗?我想它并不复杂,但对于我的生活,我无法让它工作

感谢任何帮助过的人!

修改 我设法通过更改行

来使其工作
ar rs genericdfs.a genericdfs.c

ar rs libgenericdfs.a genericdfs.o

并将最终的连接线更新为libgenericdfs.a

但现在有一个不同的问题。我在clean:标签中包含了几个rm -f命令,但是当我运行" make"时,他们不会删除那里写的文件。来自终端。

如果我跑步"干净"然后一切都被删除了。我需要添加"清洁"到了#34;所有"标签在顶部?我读到你不应该这样做

1 个答案:

答案 0 :(得分:1)

gcc使用

传递库
gcc -Lfull/path/to/library 

或者如果库名称以'lib'开头并且在库搜索路径上,则可以使用-l和lib以及.a删除。例如,使用名为libtest.a的库。

gcc -ltest

对于像数学-lm和zlib这样使用得很好的库,有一些特殊情况我认为。