我有以下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中包含静态库的正确方法是什么?
答案 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
的子目录,可以搜索它来查找库”。我可以看到三种可能性:
libmine.a
的子目录,在这种情况下,您还需要将-lmine
添加到链接器行(在引用该库的目标文件之后)。libmine
,在这种情况下,您只需将其列为文件./libmine
,前面没有-L
。 libmine.a
。您可以写./libmine.a
或-L . -lmine
,两者都应该找到库。答案 3 :(得分:8)
-L
仅提供查找.a
或.so
文件的路径。您要查找的是将-lmine
添加到LIBS
变量。
使-static -lmine
强制它选择静态库(如果存在静态库和动态库)。
答案 4 :(得分:0)
尽管我受到当局的恳求(没有答复),但我仍然无法发表自己的问题。 我正在寻找有关此任务的帮助: 我有一个主项目和与其链接的静态库。 一切都按预期工作。 由于两个项目都在开发中,因此我必须先编译库,然后再编译主项目。 我知道有一种方法可以自动执行此过程,这是几年前在MFC中使用的(批处理文件?),但是不记得详细信息了。与前/后处理有关的东西。