我想安装一个明确声称需要加速安装的linux工具。(http://www.statmt.org/moses/?n=Development.GetStarted)
我已经下载了boost1.42的源代码(放在/usr/local/boost1.42中)来编译它。虽然编译过程会产生很多错误和警告(这是正常的吗?升级官方网站说不应该有其他错误,但是对于IO错误。),最后我在/ usr中得到了/ stage / lib和/ boost /local/boost1.42目录。现在我可以运行如下例子:
#include <boost/regex.hpp>
#include <iostream>
#include <string>
int main()
{
std::string line;
boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );
while (std::cin)
{
std::getline(std::cin, line);
boost::smatch matches;
if (boost::regex_match(line, matches, pat))
std::cout << matches[2] << std::endl;
}
}
$ c++ -I /usr/local/boost_1_42_0 example.cpp -o example -L~/usr/local/boost_1_42_0/stage/lib/ -lboost_regex
这实际上会发出一个可删除的文件“example”,没有编译警告和正确的行为。 但是,当我想看到它的链接细节:
$ldd -v example
结果很混乱:
linux-vdso.so.1 => (0x00007fffb4b9c000)
libboost_regex.so.1.42.0 => not found
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003f79600000)
libm.so.6 => /lib64/libm.so.6 (0x0000003f72e00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003f78e00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003f72200000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003f72a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f71e00000)
Version information:
./example:
libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6:
libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libgcc_s.so.1 (GCC_4.2.0) => /lib64/libgcc_s.so.1
libgcc_s.so.1 (GCC_3.3) => /lib64/libgcc_s.so.1
libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libm.so.6:
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libgcc_s.so.1:
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
/lib64/libpthread.so.0:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
似乎链接器在/usr/local/boost1.42/stage/lib/libboost_regex.a中找不到libboost_regex.a(参见ldd log:libboost_regex.so.1.42.0 =&gt;未找到)。
那么它真的想要加载哪个库?为什么“未找到”会产生正确的可删除文件?
如果我想确保成功安装了boost,我是否必须将/usr/local/boost1.42和/usr/local/boost1.42/stage/lib导出到任何地方,以便其他程序可以知道它的位置吗?
谢谢! 宏斌
答案 0 :(得分:3)
要在非标准位置安装boost(未在ld.so.conf中指定)并使用它,请执行以下操作:
使用--prefix
和--libdir
选项配置提升:
$ ./bootstrap.sh --prefix=${PREFIX} --libdir=${PREFIX}/lib64
构建并将boost设置rpath设置为与--libdir
相同的值,例如${PREFIX}/lib64
:
$ ./b2 -d+2 --layout=system variant=release link=shared threading=multi runtime-link=shared linkflags="-Wl,-rpath,${PREFIX}/lib64"
$ sudo ./b2 -d+2 --layout=system variant=release link=shared threading=multi runtime-link=shared linkflags="-Wl,-rpath,${PREFIX}/lib64" install
编译指定boost include目录的应用程序:
$ g++ -c -I${PREFIX}/include ...
链接您指定boost lib位置的应用程序。还将rpath嵌入到二进制文件中,以便应用程序可以找到boost库而不必使用LD_LIBRARY_PATH
:
$ g++ -L${PREFIX}/lib64 -Wl,-rpath,${PREFIX}/lib64 ...
在上面设置PREFIX以提升安装位置,例如export PREFIX=/usr/local/my_boost
。
答案 1 :(得分:0)
是的,您需要告诉动态链接器共享对象(.so
文件,而不是.a
文件)所在的位置。
这可以通过将LD_LIBRARY_PATH
设置为正确的路径(并导出该路径),或编辑/etc/ld.so.conf
(或其他一些设置文件,具体取决于分发)来完成。
(另一个选择是在链接可执行文件时使用rpath
选项,但环境设置更灵活,可用于开发。)