如何在makefile中包含静态库

时间:2012-07-05 13:06:42

标签: c linux gcc x86-64

我有以下makefile

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中包含静态库的正确方法是什么?

5 个答案:

答案 0 :(得分:39)

使用

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

答案 1 :(得分:13)

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

答案 2 :(得分:12)

确保-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,两者都应该找到库。

答案 3 :(得分:8)

-L仅提供查找.a.so文件的路径。您要查找的是将-lmine添加到LIBS变量。

使-static -lmine强制它选择静态库(如果存在静态库和动态库)。

答案 4 :(得分:0)

尽管我受到当局的恳求(没有答复),但我仍然无法发表自己的问题。 我正在寻找有关此任务的帮助: 我有一个主项目和与其链接的静态库。 一切都按预期工作。 由于两个项目都在开发中,因此我必须先编译库,然后再编译主项目。 我知道有一种方法可以自动执行此过程,这是几年前在MFC中使用的(批处理文件?),但是不记得详细信息了。与前/后处理有关的东西。