C:使用Makefile创建静态库和链接

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
Run Code Online (Sandbox Code Playgroud)

此外,如果您可以协助改进代码,我将非常感激.

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
Run Code Online (Sandbox Code Playgroud)

这组规则首先编译所有文件,然后它使库(libmylib.a)成为目标并使用它的工件来链接可执行文件.我还添加了单独的冗余目标表单,仅制作库.需要的文件:

user@host> ls
addSorted.c  addSorted.h  freeLinks.c  freeLinks.h  main.c  main.h Makefile
Run Code Online (Sandbox Code Playgroud)


use*_*502 6

makefile不是shell脚本.它是专家系统的配置文件.特别是一个专家系统,如果你告诉它,它知道如何有效地创建文件及其依赖关系,只需要重新制作不需要重新制作的文件.

如果你看一下你的第一条规则:

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o
Run Code Online (Sandbox Code Playgroud)

告诉系统如果决定它需要这样做,如何制作名为"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
Run Code Online (Sandbox Code Playgroud)

myProgram应该依赖于库本身,而不是库的内容,最好将库选项放在最后:

myProgram: libmylib.a
    gcc -o myProgram libmylib.a -lm
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以使用一个选项告诉gcc在当前目录中查找库:

gcc -L. -o myProgram main.o -lmylib -lm
Run Code Online (Sandbox Code Playgroud)

还有makefile变量可以帮助你不必重复这么多,所以我会把第一条规则写成:

myProgram: libmylib.a
    gcc -L. -o $@ -lmylib -lm
Run Code Online (Sandbox Code Playgroud)

但是,main.o不太可能实际上是库的一部分,所以:

myProgram: main.o libmylib.a
    gcc -L. -o $@ $< -lmylib -lm
Run Code Online (Sandbox Code Playgroud)

和图书馆规则如下:

libmylib.a: addSorted.o freeLinks.o
    ar rcu $@ $+
    ranlib $@
Run Code Online (Sandbox Code Playgroud)

$ +这里表示"所有依赖文件名".

最后,如果你想让gcc创建一个实际的静态可执行文件,而不只是使用你创建的库,你需要将'-static'选项传递给gcc.