标签: libtool

libtool链接到32位版本的libstdc ++.所以当安装了多个版本的gcc时,在64位目标平台上

首先,我想告诉你这是我在StackOverflow上的第一篇文章,所以我希望通过提出一个非常愚蠢的问题,我不会愚弄自己.我一直在谷歌上搜索这个问题几天了,到目前为止我找不到任何答案.

情况如下:

我正在研究用autotools管理的C++项目.目标平台是RHEL5 64bit,安装了两个版本的gcc:

  • gcc 4.1.2安装在/ usr中
  • gcc 4.3.5安装在/local/opt/gcc-4.3.5中

当我使用默认的gcc版本(4.1.2)构建我的项目时,一切都很顺利,但是当我切换到gcc 4.3.5时,我在链接时遇到这个错误:

/local/opt/gcc-4.3.5/lib/../lib/libstdc++.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

似乎libtool硬编码了32位版本的libstdc ++的路径.所以在命令行中,它应该是64位版本.更确切地说,失败的libtool调用是:

/bin/sh ./libtool --tag=CXX --mode=link g++  -m64   -o libfoo.la -rpath /local/opt/foo/lib  src/foo/libfoo_la-bar1.lo src/foo/libfoo_la-bar2.lo
Run Code Online (Sandbox Code Playgroud)

由libtool翻译为:

g++ -shared -nostdlib
/usr/lib/../lib64/crti.o
/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/crtbeginS.o
src/foo/.libs/libfoo_la-bar1.o
src/foo/.libs/libfoo_la-bar2.o
-Wl,--rpath
-Wl,/local/opt/gcc-4.3.5/lib/../lib
-Wl,--rpath
-Wl,/local/opt/gcc-4.3.5/lib/../lib
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/../../../../lib64
-L/lib/../lib64
-L/usr/lib/../lib64
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/../../..
/local/opt/gcc-4.3.5/lib/../lib/libstdc++.so
-lm -lc -lgcc_s
/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/crtendS.o
/usr/lib/../lib64/crtn.o
-m64 -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0
Run Code Online (Sandbox Code Playgroud)

我应该准确地说,我用来从默认gcc切换到gcc 4.3.5的方法如下:

$ export PATH=/local/opt/gcc-4.3.5/bin:$PATH
$ export LD_LIBRARY_PATH=/local/opt/gcc-4.3.5/lib:/local/opt/gcc-4.3.5/lib64:$LD_LIBRARY_PATH
$ export GCC_HOME=/local/opt/gcc-4.3.5
Run Code Online (Sandbox Code Playgroud)

我对所有这些工具都很陌生,所以我怀疑我做错了什么.如果有人能给我一个如何解决这个问题的线索,我将非常感激. …

linux gcc autotools libtool 32bit-64bit

12
推荐指数
1
解决办法
7024
查看次数

编译WITH_PIC(-DWITH_PIC, - with-pic)实际上做了什么?

从源代码编译二进制文件时,生成PIC对象之间的实际差异是什么?在某个时刻,有人会说,"我应该在编译MySQL时生成/使用PIC对象." 或不?

我已经阅读了Gentoo的位置无关代码简介,位置无关代码内部,HOWTO修复-fPIC错误,Libtool创建目标文件位置无关代码.

从PHP的./configure --help:

--with-pic:尝试仅使用PIC /非PIC对象[默认=同时使用].

来自MySQL的cmake -LAH .:

-DWITH_PIC:生成PIC对象

这个信息是一个好的开始,但给我留下了很多问题.

根据我的理解,它-fPIC在编译器中打开,编译器又在生成的二进制文件/库中生成PIC对象.我为什么要那样做?或相反亦然.也许风险更大或者可能使二进制文件更不稳定?编译某些体系结构时可能应该避免(在我的情况下是amd64/x86_64)?

默认的MySQL构建设置PIC = OFF.官方MySQL发布版本设置PIC = ON.而PHP"试图同时使用它们." 在我的测试中,设置会-DWITH_PIC=ON产生稍大的二进制文件:

          PIC=OFF     PIC=ON
mysql     776,160    778,528
mysqld  7,339,704  7,476,024
Run Code Online (Sandbox Code Playgroud)

gcc compilation cmake libtool

12
推荐指数
1
解决办法
7798
查看次数

简单的libtool替代方案?

对旧式Makefile非常满意,我正在寻找libtool的简单替代品.我不想切换到automake,当我尝试直接使用它时,我一直遇到libtool的问题.最新的一个是'不支持的硬编码属性',我厌倦了缺乏完整的文档,只是告诉我这次出了什么问题......

我只想用正确的标志编译一堆.o文件,然后将它们链接到一个共享库,这样它就可以在尽可能多的平台上运行.那里有什么可以做到这一点而不是强迫我同时切换我的所有其他工具吗?

c c++ shared-libraries libtool

11
推荐指数
2
解决办法
1803
查看次数

使用Libtool强制将静态库链接到共享库

我有一个库(libfoo),使用libtool编译成两个对象:libfoo.a和libfoo.so.

我还必须使用libtool创建另一个库(libbar),它将是一个包含所有libfoo代码的共享库(libbar.so).

为了做到这一点,我必须强制libbar链接libfoo.a,而不是libfoo.so.

我在autotools环境中,所以我必须使用标准的configure.inMakefile.am规则来解决这个问题.

我试过几件事,比如configure.in:

LDFLAGS="$LDFLAGS "-Wl,-Bstatic -lfoo -Wl,-Bdynamic"
Run Code Online (Sandbox Code Playgroud)

这总是会在链接行上产生-Wl标志; 但是-lfoo已经消失了,并且在它的开头被放置在绝对路径形式(/opt/foo/lib/libfoo.so)中.

我也尝试过:

LDFLAGS="$LDFLAGS "-L/opt/foo/lib libfoo.a"
Run Code Online (Sandbox Code Playgroud)

或者在Makefile.am中:

libbar_la_LDADD = -Wl,-Bstatic -lfoo -Wl,-Bdynamic
Run Code Online (Sandbox Code Playgroud)

libbar_la_LTLIBRARIES = libfoo.a
Run Code Online (Sandbox Code Playgroud)

等等(有很多很多变种!)

但我认为我绝对不具备Autotools/Libtool足够的知识来解决这个问题.我无法在网上找到有关它的信息,总是略有不同的问题.

static shared autotools libtool

11
推荐指数
2
解决办法
5018
查看次数

当使用libtool和gcov时,"隐藏符号`atexit'被DSO引用"

我有一个C++项目,它使用GNU Autotools构建脚本和libtool进行链接.最近我通过确保gcov添加了代码覆盖率检测

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
Run Code Online (Sandbox Code Playgroud)

..get 分别包含在我的CFLAGSLDFLAGS.在OS X 10.7.4上使用g ++ - 4.2(由自制软件安装),一切正常.

在使用g ++ 4.6.3的Ubuntu 12.04上,libtool无法链接我的一个测试:

/bin/bash ./libtool --tag=CXX   --mode=link g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib   -o myproj/inttests/locale_test myproj/inttests/locale_test.o myproj/app/libapp.la -lboost_thread-mt -lboost_system-mt -pthread -llog4cplus  
libtool: link: g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -Wl,-rpath -Wl,/usr/local/lib -o myproj/inttests/.libs/locale_test myproj/inttests/locale_test.o -pthread  -L/usr/local/lib myproj/app/.libs/libapp.so -lboost_thread-mt -lboost_system-mt /usr/lib/liblog4cplus.so -pthread
/usr/bin/ld: myproj/inttests/.libs/locale_test: hidden symbol `atexit' in /usr/lib/x86_64-linux-gnu/libc_nonshared.a(atexit.oS) is …
Run Code Online (Sandbox Code Playgroud)

ubuntu linker gcc libtool gcov

11
推荐指数
1
解决办法
1万
查看次数

如何调试包含在libtool脚本中的程序?

我有一个涉及的项目

  • 共享库,即: mylib.so
  • (测试)程序使用这些共享库,即: test_mylib

当我尝试继续运行gdbtest_mylib,它会打印:

"test_mylib": not in executable format: File format not recognized
Run Code Online (Sandbox Code Playgroud)

当我.libs/test_mylib直接使用真正的程序()时,它仍然抱怨:

.libs/test_mylib: can't load library 'libhello.so.0'
Run Code Online (Sandbox Code Playgroud)

如何运行gdb来调试我的程序?

debugging gdb libtool

11
推荐指数
2
解决办法
1764
查看次数

autotools用户如何指定静态和动态链接的组合?

我正在用autoconf,automake和libtool构建一个程序.我的工作要求我静态链接(大多数)库.这在过去并不是一个问题,因为我可以静态地将所有内容联系起来 -all-static.现在这是一个问题因为我必须使用一个只是动态的库; 它是由第三方给我们的,我们没有来源.

当然,-all-static现在导致构建失败.是否有可能告诉libtool静态链接所有内容,除了这个库?是否有可能让libtool进行静态和动态链接的任何组合,还是全部或全部?

到目前为止,我已经尝试创建一个便利库LDFLAGS = -static,这取决于我想要静态链接的库.但libtool并没有像我希望的那样连接静态库.取决于便利库的程序仍然动态地链接所有内容.

我也尝试过--disable-shared,但这并没有影响构建.


这些问题类似,但没有真正回答我的问题:

使用Libtool强制将静态库链接到共享库

是否有可能将一些(但不是全部)库静态链接到libtool?

(我不想从我的系统中删除共享库,并且指定所有内容的完整路径并不比手动链接更好,但也许这是唯一的方法.)

autotools dynamic-linking libtool static-linking

11
推荐指数
1
解决办法
1万
查看次数

在OS X Mavericks 10.9上安装apache 2.4

我想安装在我的OS X小牛队的Apache 2.4,并与有问题的./configuremake.

apache homebrew libtool osx-mavericks apache2.4

11
推荐指数
2
解决办法
2万
查看次数

Libtool声称它在交叉编译期间不支持共享库

我正在尝试为运行busybox 1.13的ARM嵌入式计算机构建expat(2.0.0)XML解析库,在./configure期间,我收到错误:

checking if libtool supports shared libraries... no
Run Code Online (Sandbox Code Playgroud)

我已经指定了我的gcc,g ++,ar,ranlib,strip等等,这些都是配置工具找到的,我在Ubuntu 12.10上运行了最新的libtool(编写本文时为2.4.2).那么为什么说libtool不支持共享库呢?我的configure命令是:

./configure --host=arm --enable-shared CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ AR=arm-none-linux-gnueabi-ar RANLIB=arm-none-linux-gnueabi-ranlib STRIP=arm-none-linux-gnueabi-strip
Run Code Online (Sandbox Code Playgroud)

...并且呼叫的完整输出是:

    configure: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used.
checking build system type... i686-pc-linux-gnu
checking host system type... arm-unknown-none
checking for arm-gcc... arm-none-linux-gnueabi-gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we …
Run Code Online (Sandbox Code Playgroud)

arm cross-compiling libtool expat-parser

10
推荐指数
1
解决办法
7139
查看次数

make install安装时的Libtool安装问题

我使用以下autotool步骤来安装我的pacakges:

./configure
make
make install prefix=/my/path
Run Code Online (Sandbox Code Playgroud)

但是我收到了以下libtool警告" libtool:警告:记得运行'libtool --finish/usr/local/lib '和" libtool:warning:'lib/my.la'尚未安装在'/ usr/local/lib' "使用autotool安装我的软件包.如果我更改为以下命令,问题就会消失:

./configure
make prefix=/my/path
make install prefix=/my/path
Run Code Online (Sandbox Code Playgroud)

看起来第一种方法不能prefix正确地替换为libtool.我该如何避免这个问题?

makefile libtool

10
推荐指数
1
解决办法
4461
查看次数