首先,我想告诉你这是我在StackOverflow上的第一篇文章,所以我希望通过提出一个非常愚蠢的问题,我不会愚弄自己.我一直在谷歌上搜索这个问题几天了,到目前为止我找不到任何答案.
情况如下:
我正在研究用autotools管理的C++项目.目标平台是RHEL5 64bit,安装了两个版本的gcc:
当我使用默认的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)
我对所有这些工具都很陌生,所以我怀疑我做错了什么.如果有人能给我一个如何解决这个问题的线索,我将非常感激. …
从源代码编译二进制文件时,生成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) 对旧式Makefile非常满意,我正在寻找libtool的简单替代品.我不想切换到automake,当我尝试直接使用它时,我一直遇到libtool的问题.最新的一个是'不支持的硬编码属性',我厌倦了缺乏完整的文档,只是告诉我这次出了什么问题......
我只想用正确的标志编译一堆.o文件,然后将它们链接到一个共享库,这样它就可以在尽可能多的平台上运行.那里有什么可以做到这一点而不是强迫我同时切换我的所有其他工具吗?
我有一个库(libfoo),使用libtool编译成两个对象:libfoo.a和libfoo.so.
我还必须使用libtool创建另一个库(libbar),它将是一个包含所有libfoo代码的共享库(libbar.so).
为了做到这一点,我必须强制libbar链接libfoo.a,而不是libfoo.so.
我在autotools环境中,所以我必须使用标准的configure.in或Makefile.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足够的知识来解决这个问题.我无法在网上找到有关它的信息,总是略有不同的问题.
我有一个C++项目,它使用GNU Autotools构建脚本和libtool进行链接.最近我通过确保gcov添加了代码覆盖率检测
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
Run Code Online (Sandbox Code Playgroud)
..get 分别包含在我的CFLAGS和LDFLAGS.在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) 我有一个涉及的项目
mylib.sotest_mylib当我尝试继续运行gdb时test_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来调试我的程序?
我正在用autoconf,automake和libtool构建一个程序.我的工作要求我静态链接(大多数)库.这在过去并不是一个问题,因为我可以静态地将所有内容联系起来
-all-static.现在这是一个问题因为我必须使用一个只是动态的库; 它是由第三方给我们的,我们没有来源.
当然,-all-static现在导致构建失败.是否有可能告诉libtool静态链接所有内容,除了这个库?是否有可能让libtool进行静态和动态链接的任何组合,还是全部或全部?
到目前为止,我已经尝试创建一个便利库LDFLAGS = -static,这取决于我想要静态链接的库.但libtool并没有像我希望的那样连接静态库.取决于便利库的程序仍然动态地链接所有内容.
我也尝试过--disable-shared,但这并没有影响构建.
这些问题类似,但没有真正回答我的问题:
(我不想从我的系统中删除共享库,并且指定所有内容的完整路径并不比手动链接更好,但也许这是唯一的方法.)
我想安装在我的OS X小牛队的Apache 2.4,并与有问题的./configure和make.
我正在尝试为运行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) 我使用以下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.我该如何避免这个问题?