【问题标题】:Add .so and .a libraries to Makefile将 .so 和 .a 库添加到 Makefile
【发布时间】:2012-08-21 12:29:04
【问题描述】:

我有一个看起来像这样的生成文件。

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

我该怎么做呢。

【问题讨论】:

  • 不能是整个makefile,但我建议添加到LDLIBS
  • 这是项目中唯一的 makefile。

标签: c++ makefile static-libraries


【解决方案1】:

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

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

-L 是库的路径,-l 是库名,这里libYARP_OS.a 将作为-lYARP_OS 传递。

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

【讨论】:

  • 如何将它添加到 makefile?
  • 感谢刚刚潜入这个世界的 C++ 菜鸟。
【解决方案2】:

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

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

如 swair 所述。

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

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

详情请见'Shared libraries and static libraries'

在您的具体情况下,我会将它们添加到 LDLIBS= 行。

注意:链接顺序时要小心,这在将程序链接在一起时很重要。有关详细信息,请参阅'Link order of libraries'。例如:

$ 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'

另见类似问题:How to link to a static library in C?

【讨论】:

  • 所以我可以这样做:LDLIBS=-lconfig++ -lcxcore -lcv -lGL -lGLU -lglut -lhighgui -lSDL -lftgl -lueye_api -lboost_filesystem -lboost_system -lann /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
  • 这确实可行,但它也可能取决于对象 AFAIK 之间的相互依赖关系。成功了吗?
【解决方案3】:

-lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_init 附加到LDLIBS

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

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

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

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

这个问题可能有助于大致了解 C 和 C++ 中的库用法:How to use Libraries

【讨论】:

    【解决方案4】:

    在 Makefile 中,像这样添加

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

    这将链接您需要的库

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多