16

我有一个看起来像这样的makefile。

DEFINES=-std=c++0x
INCS_GTK=-I/usr/include/gtk-2.0 -I/usr/include/glib-2.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gtk-2.0/gdk -I/usr/include/pango-1.0 -I/usr/lib/gtk-2.0/include -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include
INCS=-I/usr/include/freetype2 -I/usr/include/mysql -Iframeworks ${INCS_GTK}
LDLIBS=-lconfig++ -lcxcore -lcv -lGL -lGLU -lglut -lhighgui -lSDL -lftgl -lueye_api -lboost_filesystem -lboost_system -lann -lpthread -lflycapture -lglog -lmysqlpp -lmysqlclient -lunittest++
DEBUG=-g -pg
WARNINGS=-Wall -Wextra -pedantic -Wno-long-long #-O3 -Weffc++
BUILDDIR=build
BINDIR=dist

MAINCXX=${shell find -name '*.cxx'}
TARGETS=${MAINCXX:%.cxx=%}
CXXFLAGS=${DEBUG} ${WARNINGS} ${DEFINES} ${INCS}
LDFLAGS=${DEBUG} ${WARNINGS} ${DEFINES}
include IDEconfigs/Makefile/generic.mk

我想将静态库的以下路径添加到 makefile 。

/usr/local/lib/libYARP_OS.a  /usr/local/lib/libYARP_sig.a  /usr/local/lib/libYARP_math.a  /usr/local/lib/libYARP_dev.a  /usr/local/lib/libYARP_name.a  /usr/local/lib/libYARP_init.a

我该怎么做呢。

4

4 回答 4

21

让我们考虑一下您的/usr/local/lib/libYARP_OS.a.

您可以做的是,-L/usr/local/lib/在您的 makefile 中作为变量之一。然后您可以-lYARP_OS附加到 LDLIBS。

-L 是 lib 的路径,-l 是这里的 lib 名称,libYARP_OS.a将作为-lYARP_OS.

在命令行上,您可以执行以下操作:gcc -o main main.c -L/usr/local/lib/ -lYARP_OS. 这应该给你一个想法。

于 2012-08-21T12:39:19.130 回答
12

您可以使用-L<path>标志告诉 GCC 任何库的位置,然后将其包含在-l<libname>. 例如,这将是

$ gcc -o main main.c -L/usr/local/lib/ -lYARP_SO

正如 sair 所指出的。

或者,您也可以提供静态库的完整路径并直接编译,例如

$ gcc -o main main.c /usr/local/lib/libYARP_OS.a

有关详细信息,请参阅“共享库和静态库”

在您的特定情况下,我会将它们添加到LDLIBS=行中。

注意:链接顺序要小心,这在将程序链接在一起时是相关的。有关详细信息,请参阅“库的链接顺序”。例如:

$ gcc -Wall calc.c -lm -o calc   (correct order)

作品

$ cc -Wall -lm calc.c -o calc    (incorrect order)
main.o: In function `main':
main.o(.text+0xf): undefined reference to `sqrt'

另请参阅这个类似的问题:如何链接到 C 中的静态库?

于 2012-08-21T12:45:20.787 回答
6

附加-lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_initLDLIBS.

警告:链接顺序可能很重要。

此外,请确保链接器知道这/usr/local/lib是查找库的地方,否则会使用-L/usr/local/lib(您可以添加另一个 makefile 变量,例如LIBPATHS或类似的东西来包含库路径)来指示它。

作为一般概要,如果您libMyLib.a在文件夹中有一个库/my/path,则可以使用以下参数调用gcc(或):g++

gcc -L/my/path -lMyLib [...]
  • -L用于包含链接器查找库的路径
  • -l用于链接库,必须不带lib前缀和扩展名传递

这个问题可能有助于大致了解 C 和 C++ 中的库使用:如何使用库

于 2012-08-21T12:54:49.080 回答
0

在 Makefile 中,像这样添加

USER_LIBS = -lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_init

这将链接您需要的库

于 2017-05-05T11:18:39.737 回答