我有以下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中包含静态库的正确方法是什么呢?
4条答案
按热度按时间mmvthczy1#
使用了
如:
为了确保静态编译,您还可以添加
或者,您可以直接摆脱整个库的搜索,并直接与链接。
假设你有
main.c
,fun.c
和一个静态库libmine.a
。kgqe7b3p2#
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
,两者都可以找到这个库。bhmjp9jg4#
-L
只给出了.a
或.so
文件的路径,你要找的是将-lmine
添加到LIBS
变量中。使
-static -lmine
强制它选择静态库(如果同时存在静态库和动态库)。附加:假设文件的路径已经通过
-L
传递给链接器(或编译器驱动程序),你也可以通过-l:libfoo.a
明确告诉它链接libfoo.a
。注意,在这种情况下,文件名包括传统的lib
-前缀。你也可以用这种方式给予完整的路径。有时候,这是更好的方法来“引导”链接器到正确的位置。