c - 使用 -l 标志链接静态库

标签 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 我得到一个错误。两者不应该一样工作吗?

最佳答案

这是一个基本的、不切实际的 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

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

-lfoo

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

关于c - 使用 -l 标志链接静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42257463/

相关文章:

macos - 是否可以在 Mac OS X 上构建 FreeGLUT?

c++ - 链接器是否对静态符号或动态符号有任何偏好?

java - java中静态变量的初始化

c - 从 makefile 传递多个参数

java - Java中运行DOS命令的问题

java - 抽象类或接口(interface)中的 public static final 字段

C - 条件总是跳转到 'Else'?

c - 如何使用 sqlite3 C API 插入多个 blob?

c - 输出c中的元音

c - self 复制代码,如何在第一次迭代和后续迭代中实现不同的行为?