use*_*714 15 c makefile static-libraries
我试图了解静态和共享库.
我想要执行以下操作来创建一个makefile,它将单独的编译和链接分开,以便在形成最终的静态可执行文件时创建和链接静态库.
我有Makefile的以下代码,但我收到以下错误
Makefile:13: *** missing separator.  Stop.
但我也试图了解如何实际链接/创建库.
如果我line 12在终端中运行命令后它们工作,而不是在makefile中.
myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o
main.o: main.c
    gcc -O -c -lm main.c main.h
addSorted.o: addSorted.c addSorted.h
    gcc -O -c -lm addSorted.c
freeLinks.o: freeLinks.c freeLinks.h
    gcc -O -c -lm freeLinks.c
ar rc libmylib.a main.o addSorted.o freeLinks.o    //Error Line
ranlib libmylib.a
gcc -o foo -L. -lmylib foo.o
clean:
    rm -f myProgram main.o addSorted.o freeLinks.o
此外,如果您可以协助改进代码,我将非常感激.
Ser*_*gey 20
试试这个:
all: myProgram
myProgram: main.o libmylib.a #libmylib.a is the dependency for the executable
        gcc -lm -o myProgram main.o -L. -lmylib
main.o: main.c
        gcc -O -c main.c main.h
addSorted.o: addSorted.c addSorted.h
        gcc -O -c addSorted.c
freeLinks.o: freeLinks.c freeLinks.h
        gcc -O -c freeLinks.c
libmylib.a: addSorted.o freeLinks.o #let's link library files into a static library
        ar rcs libmylib.a addSorted.o freeLinks.o
libs: libmylib.a
clean:
        rm -f myProgram *.o *.a *.gch #This way is cleaner than your clean
这组规则首先编译所有文件,然后它使库(libmylib.a)成为目标并使用它的工件来链接可执行文件.我还添加了单独的冗余目标表单,仅制作库.需要的文件:
user@host> ls
addSorted.c  addSorted.h  freeLinks.c  freeLinks.h  main.c  main.h Makefile
makefile不是shell脚本.它是专家系统的配置文件.特别是一个专家系统,如果你告诉它,它知道如何有效地创建文件及其依赖关系,只需要重新制作不需要重新制作的文件.
如果你看一下你的第一条规则:
myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o
告诉系统如果决定它需要这样做,如何制作名为"myProgram"的文件.冒号后面的部分是myProgram需要的文件.如果它们不存在,或者决定它们已经过时,make会尝试找到一些可用于创建或更新它们的配方.完成所有操作后,make会执行"gcc ..."行并假定将创建或更新myProgram.
您拥有的ar和ranlib行与makefile规则所需的语法不匹配.从它们的外观来看,它们似乎是制作libmylib.a的秘诀.如果你把它们放入语法make需要说,你得到:
libmylib.a: main.o addSorted.o freeLinks.o
    ar rcu libmylib.a main.o addSorted.o freeLinks.o
    ranlib libmylib.a
myProgram应该依赖于库本身,而不是库的内容,最好将库选项放在最后:
myProgram: libmylib.a
    gcc -o myProgram libmylib.a -lm
如果你愿意,你可以使用一个选项告诉gcc在当前目录中查找库:
gcc -L. -o myProgram main.o -lmylib -lm
还有makefile变量可以帮助你不必重复这么多,所以我会把第一条规则写成:
myProgram: libmylib.a
    gcc -L. -o $@ -lmylib -lm
但是,main.o不太可能实际上是库的一部分,所以:
myProgram: main.o libmylib.a
    gcc -L. -o $@ $< -lmylib -lm
和图书馆规则如下:
libmylib.a: addSorted.o freeLinks.o
    ar rcu $@ $+
    ranlib $@
$ +这里表示"所有依赖文件名".
最后,如果你想让gcc创建一个实际的静态可执行文件,而不只是使用你创建的库,你需要将'-static'选项传递给gcc.