我有一个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;所有"标签在顶部?我读到你不应该这样做
答案 0 :(得分:1)
gcc使用
传递库gcc -Lfull/path/to/library
或者如果库名称以'lib'开头并且在库搜索路径上,则可以使用-l和lib以及.a删除。例如,使用名为libtest.a的库。
gcc -ltest
对于像数学-lm和zlib这样使用得很好的库,有一些特殊情况我认为。