如何在makefile中包含静态库

pyt*_*nic 29 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
Run Code Online (Sandbox Code Playgroud)

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

Aft*_*nix 45

使用

LDFLAGS= -L<Directory where the library resides> -l<library name>
Run Code Online (Sandbox Code Playgroud)

喜欢 :

LDFLAGS = -L. -lmine
Run Code Online (Sandbox Code Playgroud)

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

LDFLAGS = -static
Run Code Online (Sandbox Code Playgroud)

或者你可以摆脱整个库搜索,并直接与它链接.

说你有main.c fun.c

和一个静态库libmine.a

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

$(CC) $(CFLAGS) main.o fun.o libmine.a
Run Code Online (Sandbox Code Playgroud)


oua*_*uah 15

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread 
Run Code Online (Sandbox Code Playgroud)

  • OP在`gcc`编译和链接行中添加了`-L./ libmine`但没有添加`libmine.a`.`-L./ libmine`告诉`gcc`查看`./ libmine`目录以搜索对象文件和库.添加`libmine.a`告诉`gcc`你想要将你的可执行文件链接到`libmine.a`库. (4认同)
  • 你能解释一下这是如何工作的吗? (2认同)

Jon*_*ler 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两者都应该找到库.


0xC*_*22L 9

-L仅仅给出了路径在哪里可以找到.a.so文件.你要找的是添加-lmineLIBS变量.

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