在我的项目中,存在对libsomething来自第三方的静态库(从现在开始调用)的依赖性。最近,libsomething已推出另一个版本。我的任务是为我的软件提供对旧版本和新版本的支持。在任何给定时间的运行时仅使用一个版本libsomething,但该版本应该在程序运行之间进行配置。
我在 WinXP 上使用 MSVC2005,第二个目标是准备切换到 Linux 和 GCC。
由于两个版本都libsomething使用相同的符号,因此将它们链接到我的可执行文件中是不可能的,因为两个版本的符号都会在链接时发生冲突。
虽然我可以创建两个可执行文件(一个链接旧版本,另一个使用新版本),但我无法决定在最终部署环境中调用哪个可执行文件(遗留原因)。
libsomething我提出了为每个版本创建动态库包装器并根据某些配置文件在运行时链接它们的想法。对于 MSCV,这意味着要使用LoadLibrary(),GetProcAddress()等,而在 Linux 上我必须使用dlopen()和dlsym()。
我知道使用libtool(即libtldl)正在包装此平台依赖性以使用共享库。这是一条合适的道路吗?有更好的(或者至少是不同的)方法吗?libtldl是否有开源的替代方案?
我手上有一个项目,其中一些库被编译为可加载模块,即与libtool的-module标志链接.这些库本身应该包含所有必需的函数或它们的依赖项,也就是说,当它们与一个简单的main()函数链接时它们应该产生一个完整的程序,该函数简单地为我的程序调用模块接口的所有函数.
由于之前我遇到过不完整且无法使用的模块的问题,我有一些简单的检查程序只包含一个main()并且与模块相关联.当一个函数丢失时,链接器会发出适当的警告,所以那里都很好.但是,libtool给了我一个警告:
*** Warning: Linking the executable checkplugin_locprec against the loadable module
*** liblocprec.so is not portable!
Run Code Online (Sandbox Code Playgroud)
我理解这个警告的目的和意图(不要将程序与构建的库链接-module),但不是它的严重性,这是我的问题:
这警告有多严重?我很幸运,这可以在我正在编译的平台上运行(i386/x86_64 Linux和MinGW),或者这个警告是否与我可以放心忽略的一些模糊的自然平台相关?
如何告诉 Automake 构建一个不需要安装的动态模块?
pkglib_LTLIBRARIES = mywrapper.la
mywrapper_la_LDFLAGS = -no-undefined -module -avoid-version
Run Code Online (Sandbox Code Playgroud)
导致 mywrapper.so 安装到pkglibdir.
noinst_LTLIBRARIES = mywrapper.la
mywrapper_la_LDFLAGS = -no-undefined -module -avoid-version
Run Code Online (Sandbox Code Playgroud)
导致改为构建静态便利库。
有问题的动态模块仅用于运行测试套件,因此不能分发。
我正在针对 Windows 进行交叉编译gettext-0.18.2,但遇到了一些问题。在共享库之一的链接阶段,libtool出现以下错误消息:
/bin/bash ../libtool --tag=CXX ...
libtool: link: unsupported hardcode properties
libtool: link: See the libtool documentation for more information.
libtool: link: Fatal configuration error.
Run Code Online (Sandbox Code Playgroud)
您可以在此处libtool查看包括命令的完整构建日志(错误位于页面的最底部)。
什么会导致此错误?它意味着什么?尽管错误消息中有声明,但我似乎在文档中找不到有关此错误的任何信息。
另外值得注意的是:真正让这件事变得奇怪的是,在 Ubuntu 12.10 (Quantal) 上构建成功,没有错误……但在当前的 LTS 版本 Ubuntu 12.04 上却失败了。
附加:libtool我对成功的构建和失败的构建之间的调用行进行了比较。差异看起来像这样:

显然命令中省略了 C++ 编译器。这会导致上述错误吗?
我正在修改一个与Automake / libtool文档提供的示例非常相似的项目。摘录:
顶级configure.ac:
LT_INIT
Run Code Online (Sandbox Code Playgroud)
顶级 Makefile.am:
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src doc
Run Code Online (Sandbox Code Playgroud)
./src 生成文件.am:
lib_LTLIBRARIES = libname.la
libname_la_SOURCES = <my cc file list>
libname_la_LDFLAGS = -no-undefined -version-info $(GENERIC_LIBRARY_VERSION)
include_HEADERS = <my h file list>
bin_PROGRAMS = progname
progname_SOURCES = <my cc file list>
progname_LDADD = libname.la
progname_LDFLAGS = -static
Run Code Online (Sandbox Code Playgroud)
在我的包创建软件提供的fakeroot环境中,我执行以下命令
$ autogen.sh # contains the usual calls to aclocal, libtoolize, automake, autoconf.
$ ./configure --prefix="/usr" --disable-static
$ make
...
/bin/sh ../libtool --tag=CXX --mode=link g++ -Wall …Run Code Online (Sandbox Code Playgroud) 我想使用 Linux Mint 16/Ubuntu 13.10 的库存自动工具配置一个自动工具项目来调用非标准链接器(gold链接器)
我相信我会通过以下方式实现这一目标:
libtoolize- 项目./configure LD=/path/to/my/linker ... etc.然而这并没有起到什么作用。libtoolize已经成功了。在标准之后,./configure; make我现在看到正在libtool执行链接:
/bin/bash ./libtool --tag=CXX --mode=link g++ -g -O2 -o helloworld helloworld.o
Run Code Online (Sandbox Code Playgroud)
但传递LD=/path/to/my/linker到configure没有什么区别。实验上,我什至跑了:
./configure LD=/does/not/exist
Run Code Online (Sandbox Code Playgroud)
预计会引发错误,但我没有。输出包含:
checking if the linker (/does/not/exist -m elf_x86_64) is GNU ld... no
checking whether the g++ linker (/does/not/exist -m elf_x86_64) supports shared libraries... yes
Run Code Online (Sandbox Code Playgroud)
此后,make 继续成功链接,并g++像以前一样调用。
配置非标准链接器的正确方法是什么?
我正在尝试将libcsv转换为使用libtool,因此我可以在mac os x上使用它而不会破坏makefile.当我尝试运行从工具生成的makefile时,我收到以下错误:
~/software/libcsv (gnu_tools) $ make
tag=CC --mode=compile gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\"
-DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"libcsv\"
-DVERSION=\"3.0.1\" -I. -g -O2 -MT libcsv.lo -MD -MP -MF .deps/libcsv.Tpo -c -o libcsv.lo
libcsv.c
/bin/sh: --mode=compile: command not found
make: [libcsv.lo] Error 127 (ignored)
mv -f .deps/libcsv.Tpo .deps/libcsv.Plo
mv: rename .deps/libcsv.Tpo to .deps/libcsv.Plo: No such file or directory
make: *** [libcsv.lo] Error 1
Run Code Online (Sandbox Code Playgroud)
我正在运行OS X 10.5.经过一番小小的考虑后,我注意到生成的makefile有一个空的libtool var:
<generated makefile>
LD =
LDFLAGS =
LIBOBJS =
LIBS =
LIBTOOL =
LIPO =
LN_S = …Run Code Online (Sandbox Code Playgroud) 我对libtool的东西很新.我有一个问题,构建我的项目需要libtool 1.5,但我系统上的默认libtool(debian,squeeze)是2.2.我做的是我从源代码安装了libtool 1.5,并将其放入/ usr/local.我的PATH变量首先选择/ usr/local/bin路径.
运行autogen时,我可以看到它"看到"libtool 1.5.但是,当我运行configure脚本时,我的构建目录中会出现2.2版的libtool脚本.我不知道它来自哪里,因为我使用包管理器卸载了libtool 2.2.
你能建议如何解决这个问题吗?如何在我的构建文件夹中生成libtool脚本?与ltmain.sh有什么关系?
谢谢,维亚切斯拉夫
我一直在尝试构建GLTools库,它将OpenGL SuperBible附带到带有automake的libtool库中.
我已经设置了autoconf和automake但是当涉及到实际构建库时,我得到:
$ make
make: *** No rule to make target `GLBatch.lo', needed by `libgltools.la'. Stop.
Run Code Online (Sandbox Code Playgroud)
我已经搜索了谷歌,因为我的理智会让我无所事事,我是汽车制造新手所以我不太确定要搜索什么.我确定这是一个小错误,或者我错过了一些基本的东西.
这是我的Makefile.am:
ACLOCAL_AMFLAGS = -I m4
lib_LTLIBRARIES = libgltools.la
libgltools_la_SOURCES = GLBatch.cpp GLShaderManager.cpp GLTriangeBatch.cpp GLTools.cpp math3d.cpp glew.c
#libgltools_la_CFLAGS =
libgltools_la_LIBADD = -lX11 -lglut -lGL -lGLU -lm
include_HEADERS = GLBatchBase.h GLBatch.h GLFrame.h GLFrustum.h GLGeometryTransform.h GLMatrixStack.h GLShaderManager.h GLTools.h GLTriangleBatch.h math3d.h StopWatch.h GL/glew.h GL/glxew.h GL/wglew.h
EXTRA_DIST = autogen.sh
Run Code Online (Sandbox Code Playgroud)
而且我的configure.ac如果重要:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下选项在Mac OS X 10.8上构建google-glog:
./configure CXX ='clang ++'CXXFLAGS =' - std = c ++ 11 -stdlib = libc ++'
尽管该库与libstdc ++链接.
为什么,以及如何解决这个问题?