gcc 如何在makefile中包含静态库

wqsoz72f  于 2022-11-13  发布在  其他
关注(0)|答案(4)|浏览(176)

我有以下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

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

mmvthczy

mmvthczy1#

使用了

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

如:

LDFLAGS = -L. -lmine

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

LDFLAGS = -static

或者,您可以直接摆脱整个库的搜索,并直接与链接。
假设你有main.cfun.c和一个静态库libmine.a

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

kgqe7b3p2#

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

0lvr5msh3#

请确保-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添加到链接器行(在引用库的目标文件之后)。
1.您有一个静态归档文件libmine,在这种情况下,您只需将其列为文件./libmine,前面没有-L
1.在当前目录下有一个文件libmine.a,你可以写./libmine.a-L . -lmine,两者都可以找到这个库。

bhmjp9jg

bhmjp9jg4#

-L只给出了.a.so文件的路径,你要找的是将-lmine添加到LIBS变量中。
使-static -lmine强制它选择静态库(如果同时存在静态库和动态库)。
附加:假设文件的路径已经通过-L传递给链接器(或编译器驱动程序),你也可以通过-l:libfoo.a明确告诉它链接libfoo.a。注意,在这种情况下,文件名包括传统的lib-前缀。你也可以用这种方式给予完整的路径。有时候,这是更好的方法来“引导”链接器到正确的位置。

相关问题