38

我有以下生成文件

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

4

4 回答 4

58

采用

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
于 2012-07-05T13:31:11.320 回答
22
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread 
于 2012-07-05T13:32:17.690 回答
13

确保-L选项出现在-l选项之前;链接器命令行中的选项顺序确实很重要,尤其是对于静态库。该-L选项指定要搜索库(静态或共享)的目录。该-lname选项指定与libmine.a(static) 或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没有 no的文件。-L
  3. libmine.a在当前目录中有一个要提取的文件。您可以编写./libmine.a-L . -lmine两者都应该找到该库。
于 2012-07-05T13:56:59.333 回答
10

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

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

-L补充:假设文件的路径已经libfoo.a通过-l:libfoo.a. 请注意,在这种情况下,名称包括常规的 -lib​​ 前缀。您也可以通过这种方式给出完整路径。有时这是将链接器“引导”到正确位置的更好方法。

于 2012-07-05T13:10:52.720 回答