使用-l标志链接静态库

时间:2017-02-15 18:34:52

标签: c makefile static

如何使用-l标志编译makefile?

我有一个看起来像

的makefile
myLibrary:
    gcc -c myLibrary.c -o myLibrary.o
    ar cr libmyLibrary.a myLibrary.o

然后我用

编译我的主程序
main:
    gcc -g -c -o main.o main.c
    gcc main.o -o main libmyLibrary.a

上面的makefile有效,但如果我想替换

libmyLibrary.a

-lmyLibrary我收到错误消息。难道两者都不一样吗?

2 个答案:

答案 0 :(得分:2)

这是一个基本的,不切实际的makefile,它将构成静态库libmyLibary 在它生成程序main之前,它将与静态库链接 使用-L(库搜索路径)和-l(库)选项。

<强>生成文件

.PHONY: all clean

all: libmyLibrary.a main

main: main.o | libmyLibrary.a
    $(CC) -o main main.o -L. -lmyLibrary

libmyLibrary.a: myLibrary.o
    $(AR) rcs libmyLibrary.a myLibrary.o

clean:
    rm -f *.o libmyLibrary.a main

的运行方式如下:

$ make
cc    -c -o myLibrary.o myLibrary.c
ar rcs libmyLibrary.a myLibrary.o
cc    -c -o main.o main.c
cc -o main main.o -L. -lmyLibrary

我想你知道,制作一个图书馆和一个程序是不现实的 在同一个makefile中与它链接,因为库的位置是 你不需要不断改造它以将它与许多程序联系起来。你真的有 libmyLibrary.a的makefile和其他程序的makefile 用它。

这是gcc链接选项-L-l的工作原理:

-L/path/to/search

告诉链接器查找您在-l中使用/path/to/search选项指定的任何库, 在它的默认搜索目录中查找它们之前。当前目录., 不是链接器的默认搜索目录之一。所以,如果你想要它 找到当前目录中使用-l选项指定的库,然后您需要 指定-L.

-lfoo

告诉链接器搜索动态库libfoo.so或静态库 库libfoo.a,首先在-L目录中,如果有的话,按照您的顺序排列 指定它们,然后在其默认搜索目录中。它停止搜索 只要在其中一个搜索目录中找到libfoo.solibfoo.a。 如果它在同一目录中找到两者,则默认情况下它会将libfoo.so与 您的计划,而不是libfoo.a

答案 1 :(得分:1)

要纯粹静态链接库,请使用-static,Like

gcc -static main.c libmyLibrary.a

并运行可执行文件./a.out GCC Linux。