我正在开发一个使用autoconf,automake和libtool构建的项目.该项目以二进制和源代码形式分发.
在Linux上,默认情况下,构建脚本会动态链接到所有库.这是有道理的,因为Linux用户可以依赖他们的发行版的包管理器来处理依赖关系.
在Windows上,默认情况下,构建脚本使用libtool -all-static选项静态链接到所有库.这是有道理的,因为Windows没有提供任何依赖项,并且能够分发包含所有依赖项的单个二进制文件而不是分散大量的DLL是有帮助的.
在OSX上,一些依赖项是由OS提供的,而另一些则不是.因此,动态链接到OS提供的库以及静态链接到其他库将会很有帮助.不幸的是,libtool的all-or-nothing -all-static选项在这里没有用.
是否有一种很好的方法可以让libtool 静态链接到某些库,但不是全部?
注意:我意识到我可以仔细编译依赖项,以便只有静态构建可用.但是,我宁愿我的项目的构建系统在可用的依赖项的静态和动态构建的常见情况下是健壮的.
注意:当然,我并不关心像C/C++运行时库这样的低级依赖项,它们总是在上述所有三个平台上动态链接.
首先,我有"include_HEADERS ='我的公共标题'"和"libfoobar_la_SOURCES ='私人来源''私人标题'".一切都很好.它编译/安装/链接.但当我做"nm -C my_instaed_lib.so"时,我得到:
00005be0 T yyget_debug(void*)
00005b00 T yyget_extra(void*)
00005bf0 T yyset_debug(int, void*)
00005bb0 T yyset_extra(FM4::LexImpl*, void*)
00005b40 T yyget_column(void*)
00005b10 T yyget_lineno(void*)
00006180 T yyset_column(int, void*)
000061e0 T yyset_lineno(int, void*)
...
Run Code Online (Sandbox Code Playgroud)
这从未在任何标题中声明.
000091f0 T FM4::PrcImpl::CollectMacro()
000089d0 T FM4::PrcImpl::CollectQuote()
00008870 T FM4::PrcImpl::CollectComment()
00009350 T FM4::PrcImpl::Collect()
000093f0 T FM4::PrcImpl::Process()
00008700 T FM4::PrcImpl::PrcImpl(FM4::Processor*)
00008590 T FM4::PrcImpl::PrcImpl(FM4::Processor*)
00009970 W FM4::PrcImpl::~PrcImpl()
00009a00 W FM4::PrcImpl::~PrcImpl()
...
Run Code Online (Sandbox Code Playgroud)
这是私有未安装的标头.
我读了两次automake/libtool手册,但我不知道如何从界面中删除这个垃圾?或者是什么可以将这个废话暴露给公众api.如何控制出口到公共API?
我正在运行Linux,Ubuntu 10.04.
这不是我第一次尝试使用autotools.我做了很多研究并遵循了很多教程:这是我想要做的,我尝试过的以及我面临的问题.
目标:
我尝试了什么,我在哪里:
库名称为FXPLib,包名称为libfxplib-0.1
我的项目文件夹是:
Makefile.am (the only one)
include
include/fxplib.h (main header)
include/FXPLib
include/FXPLib/header1.h (these are public headers)
include/FXPLib/header2.h
include/FXPLib/...
src
src/sub1/file1.c
src/sub2/file1.c
src/sub3 ...
Run Code Online (Sandbox Code Playgroud)我运行了autoscan,得到了一个configure.ac,在这里编辑了它:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.65])
AC_INIT([libfxplib-0.1], [0.1], [<>])
AC_CONFIG_SRCDIR([src/object_system/FXP_image_s.h])
AC_CONFIG_HEADERS(config.h)
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE
AM_PROG_LIBTOOL
LT_PREREQ([2.2])
LT_INIT
# Checks for programs.
AC_PROG_CC
AC_PROG_MAKE_SET
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])
# Checks for typedefs, structures, and …Run Code Online (Sandbox Code Playgroud)我试图让libtool在我的MacOS 10.8.3机器上工作.因为Apple发货的所有东西都已过时,我正在使用macports.我有最新的版本:
libtool (GNU libtool) 2.4.2
automake (GNU automake) 1.13.1
autoconf (GNU Autoconf) 2.69
Run Code Online (Sandbox Code Playgroud)
它全部安装在/ opt中.
这是configure.ac:
AC_INIT([Hello], [0.1], [bug-report@hello.example.com], [hello], [http://hello.example.com/])
AC_PREREQ([2.59])
AM_INIT_AUTOMAKE([1.10 no-define])
LT_INIT
AC_CONFIG_HEADERS([config.h])
AC_PROG_CXX
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)
这是Makefile.am:
lib_LTLIBRARIES = libsomething-1.0.la
libsomething_1_0_la_SOURCES = something.cc
bin_PROGRAMS = hello
hello_SOURCES = hello.h hello.cc main.cc
Run Code Online (Sandbox Code Playgroud)
运行glibtoolize会产生以下错误:
glibtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
glibtoolize: rerunning glibtoolize, to keep the correct libtool macros in-tree.
glibtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
Run Code Online (Sandbox Code Playgroud)
当我将此行添加到Makefile.am时:ACLOCAL_AMFLAGS =" - 我m4"我收到此错误;
glibtoolize: Consider adding `-I …Run Code Online (Sandbox Code Playgroud) 我正在使用autotools作为我的库的构建系统.最近,库被移植到Windows.虽然我遇到了一个奇怪的错误,但库成功编译并成功链接.配置和make后只有静态库.除了以下警告之外,Evertything看起来还不错libtool:
libtool: undefined symbols not allowed in i686-pc-mingw32 shared
Run Code Online (Sandbox Code Playgroud)
我通过以下代码导出了Windows机器的所有符号:
#ifdef _WIN32
# ifdef DLL_EXPORT
# define LIBRARY_API __declspec(dllexport)
# else
# define LIBRARY_API __declspec(dllimport)
# endif
#endif
#ifndef _WIN32
# define LIBRARY_API
#endif
Run Code Online (Sandbox Code Playgroud)
在我的每一个定义中:
class LIBRARY_API myClass {
// ...
Run Code Online (Sandbox Code Playgroud)
注:
操作系统:Windows 8 x86_64
编译器套件:MinGW x86_64,MSYS x86
我使用autoconf/automake/libtool来构建共享库.我想将主要数量的库版本传递给共享库soname.
我在configure.ac中有以下声明:
AC_INIT([libabc], [1.1.0])
Run Code Online (Sandbox Code Playgroud)
以下Makefile.am:
AM_CPPFLAGS = -I$(top_srcdir)/include -Wall -Wextra
LDADD = libabc.la
lib_LTLIBRARIES = libabc.la
nodist_libabc_la_SOURCES = $(top_srcdir)/config.h
libabc_la_SOURCES = $(top_srcdir)/src/abc.c
Run Code Online (Sandbox Code Playgroud)
我可以为配置脚本,源和共享库soname提供相同的版本.我可以在源代码中使用自动生成的config.h中定义的VERSION或PACKAGE_VERSION,但这不会影响soname,它总是libabc.so.0.
有没有办法强制libtool使用AC_INIT指令中的主要版本?如果没有,定义主要/次要号码的首选方式是什么?
我正在尝试将多线程添加到我的库中,所以我正在为我的库创建一个线程执行器.为此我使用boost线程.
这是我在运行链接到库的测试用例时遇到的错误:
symbol lookup error: libmylibexample.so.0: undefined symbol: _ZTVN5boost6detail16thread_data_baseE
Run Code Online (Sandbox Code Playgroud)
这是我的共享库中导致错误的代码行:
MyNameSpace::Producer producer = MyNameSpace::Producer();
threads.create_thread(boost::bind(&MyNameSpace::Producer::run, &producer));
Run Code Online (Sandbox Code Playgroud)
我正在使用autotools和libtool编译库.代码编译得很好.然后我创建一个测试用例,我试图引用该库.以下是编译测试用例的编译顺序:
g++ -I. -I../include -g -O2 -MT runTest-runTest.o -MD -MP -MF .deps/runTest-runTest.Tpo -c -o runTest-runTest.o `test -f 'runTest.cc' || echo './'`runTest.cc
Run Code Online (Sandbox Code Playgroud)
这是我的链接阶段:
mv -f .deps/runTest-runTest.Tpo .deps/runTest-runTest.Po
/bin/bash ../libtool --tag=CXX --mode=link g++ -g -O2 ../libmylibexample/libmylibexample.la -o runTest runTest-runTest.o -lboost_system -lboost_filesystem -lboost_regex -lboost_thread-mt -lfftw3 -ltiff
libtool: link: g++ -g -O2 -o .libs/runTest runTest-runTest.o ../libmylibexample/.libs/libmylibexample.so -lboost_system -lboost_filesystem -lboost_regex -lboost_thread-mt -lfftw3 /usr/lib/x86_64-linux-gnu/libtiff.so
Run Code Online (Sandbox Code Playgroud)
我的一位同事建议初始化一些与线程相关的boost模板,以帮助共享库从boost_thread库加载符号.我并不完全确定这样做的最佳方法,如果这是正确的方法来加载东西.
总结一下:错误似乎涉及无法从我的共享库加载libboost_thread中定义的符号.
我正在尝试交叉编译gst-ti-pluginarm设备但是当我做make installlibtool时返回错误:
../libtool: line 1085: arm-none-linux-gnueabi-ranlib: command not found
Run Code Online (Sandbox Code Playgroud)
这里的问题是,这个工具可从PATH,当我从控制台尝试它,它工作正常.
可能有什么不对?我使用CodeSourcery工具链.
我已经在Yosemite上安装了imagemagick,但在安装过程中我遇到了这个错误......
Linking /usr/local/Cellar/libtool/2.4.2...
Error: Could not symlink share/info/libtool.info
/usr/local/share/info is not writable.
我试过brew link libtool但得到同样的错误
我试过跑步 brew doctor and brew prune
我还能做些什么来尝试正确安装?
我正在尝试为ARM交叉编译linphone。我使用配置
./configure --host=arm-linux-gnueabi --with-gnu-ld --disable-static --disable-glib --with-osip=/home/user/linphone_wheezy --with-readline=/home/user/linphone_wheezy SPEEX_CFLAGS="-I/home/user/linphone_wheezy/include" SPEEX_LIBS="-L/home/user/linphone_wheezy/lib -lspeex" SPEEXDSP_CFLAGS="-I/home/user/linphone_wheezy/include" SPEEXDSP_LIBS="-L/home/user/linphone_wheezy/lib -lspeexdsp" CC=$CROSS_TOOLCHAIN/bin/arm-linux-gnueabi-gcc --disable-video --enable-gtk_ui=no
Run Code Online (Sandbox Code Playgroud)
配置脚本成功执行,但是当我运行make时,链接时出现以下错误:
libtool: link: unable to infer tagged configuration
libtool: link: specify a tag with `--tag'
Run Code Online (Sandbox Code Playgroud)
我尝试添加
--tag=CC and --tag=LD
Run Code Online (Sandbox Code Playgroud)
但没有成功。有人可以给这个错误一些提示吗?
libtool ×10
c++ ×3
autotools ×2
macos ×2
makefile ×2
automake ×1
boost-thread ×1
c ×1
compilation ×1
embedded ×1
gcc ×1
imagemagick ×1
linux ×1
mingw ×1
mingw-w64 ×1