【问题标题】:How to include static library in makefile如何在makefile中包含静态库
【发布时间】:2012-07-05 21:28:49
【问题描述】:

我有以下生成文件

CXXFILES = pthreads.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = -lpthread -ldl

all:
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)

clean:
    rm -f prog *.o

我正在尝试将./libmine 库包含在CXXFLAGS 中,但包含静态库似乎不是正确的方法,因为当我编译程序时,我收到许多未定义的引用错误。那么在 makefile 中包含静态库的正确方法是什么?

【问题讨论】:

    标签: c linux gcc x86-64


    【解决方案1】:

    使用

    LDFLAGS= -L<Directory where the library resides> -l<library name>
    

    喜欢:

    LDFLAGS = -L. -lmine
    

    为了确保静态编译,您还可以添加

    LDFLAGS = -static
    

    或者您可以摆脱整个库搜索,并直接与之链接。

    说你有 main.c fun.c

    还有一个静态库 libmine.a

    然后你可以在 Makefile 的最后一个链接行中做

    $(CC) $(CFLAGS) main.o fun.o libmine.a
    

    【讨论】:

      【解决方案2】:
      CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
      LIBS = libmine.a -lpthread 
      

      【讨论】:

      • OP 在gcc 编译和链接行中添加了-L./libmine,但没有添加libmine.a。 -L./libmine 告诉 gcc 查看 ./libmine 目录以搜索对象文件和库。添加libmine.a 告诉gcc 你想将你的可执行文件与libmine.a 库链接。
      • 澄清一下,LIBS = libmine.a 不适用于 -L./libmine。看来绝对路径是必要的。使用 LIBS = -lmine,它将查找 libmine.a 或 libmine.so(使用 gcc 5.4.0 测试)
      【解决方案3】:

      确保-L 选项出现在-l 选项之前;链接器命令行中的选项顺序确实很重要,尤其是对于静态库。 -L 选项指定要搜索库(静态或共享)的目录。 -lname 选项指定使用libmine.a(静态)或libmine.so(在大多数Unix 变体上共享,但Mac OS X 使用.dylib 而HP-UX 过去使用.sl)的库。按照惯例,静态库将位于文件libmine.a 中。这是约定,不是强制性的,但如果名称不是libmine.a 格式,则不能使用-lmine 表示法来查找它;您必须在编译器(链接器)命令行上明确列出它。

      -L./libmine 选项表示“有一个名为 libmine 的子目录可以通过搜索找到库”。我可以看到三种可能性:

      1. 您有这样一个包含libmine.a 的子目录,在这种情况下,您还需要将-lmine 添加到链接器行(在引用该库的目标文件之后)。
      2. 您有一个文件libmine,它是一个静态存档,在这种情况下,您只需将其列为文件./libmine,前面没有-L。
      3. 您在当前目录中有一个文件libmine.a,您要获取该文件。您可以写./libmine.a 或-L . -lmine,两者都应该找到库。

      【讨论】:

        【解决方案4】:

        -L 仅给出了找到.a 或.so 文件的路径。您正在寻找的是将-lmine 添加到LIBS 变量中。

        让-static -lmine 强制它选择静态库(以防静态库和动态库都存在)。

        补充:假设文件的路径已通过-L 传送给链接器(或编译器驱动程序),您也可以通过给出-l:libfoo.a 来明确告诉它链接libfoo.a。请注意,在这种情况下,名称包括常规的lib-前缀。您也可以通过这种方式给出完整路径。有时这是将链接器“引导”到正确位置的更好方法。

        【讨论】:

        • 我读到了-static 标志,但我担心-static 会使所有引用的库成为静态的,而我只是想要一个。 -static 会仅将正在进行的引用标记为静态吗?
        • @Cokemonkey11:-static 之后的任何库都应该更喜欢库的静态版本,是的。
        • @0xC00000022L 所以如果我这样做-static -lfoo -bar,foo 和 bar 都会是静态的?我只想 foo 是静态的——这就是我想要问的。编辑:我只希望 foo 明确地 是静态的,而我希望 bar 具有标准的链接行为。
        • @Cokemonkey11:它会更喜欢在-static后面带有-lbar的静态版本。但是,据我所知,如果没有静态库,它将使用它找到的东西。不过,这取决于您与 GCC 驱动程序一起使用的链接器脚本。
        猜你喜欢
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多