链接器没有使用g ++进行本地(用户)boost安装

时间:2012-07-25 07:03:24

标签: dynamic boost linker g++

我想在boost C ++库中进行本地安装(在我的主文件夹(Linux)中,比如$ HOME / boost),以及系统范围内安装的升级库的默认值。我是用魔法建造的,效果很好。

之后,我设置环境变量CPLUS_INCLUDE_PATH和LD_LIBRARY_PATH以匹配本地安装的目标,因此两者分别指向$ HOME / boost / include和$ HOME / boost / lib /。

为了测试它,我使用以下代码测试标题的CPLUS_INCLUDE_PATH的正确用法:

#include <boost/version.hpp>
#include <iostream>
#include <iomanip>

int main()
{
  std::cout << "Boost version: " << BOOST_LIB_VERSION << std::endl;

  return 0;
}

使用g++ -o Test_boost_version test_boost_version.cpp进行编译按预期工作,报告预期(本地)版本。将CPLUS_INCLUDE_PATH置为空可以为我提供默认的系统范围安装的升级版本。到目前为止一切都很好。

为了测试链接,我使用了以下代码(取自boost主页:

#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;
    }   
}

并使用g++ -o Test_boost_linking test_boost_linking.cpp -lboost_regex构建它。

然而,调用ldd Test_boost_linking不会使用本地安装(通过LD_LIBRARY_PATH提供),但是给了我:libboost_regex.so.1.42.0 => /usr/lib/libboost_regex.so.1.42.0 (0x00007f9264612000)

当我使用g++ -o Test_boost_linking test_boost_linking.cpp -lboost_regex -L$HOME/boost/lib时,ldd报告的是正确的库(libboost_regex.so.1.50.0 => $HOME/boost/lib/libboost_regex.so.1.50.0 (0x00007f6947d2a000))。

这对我来说实际上是一个问题,因为我想设置我的本地环境,以便编译将忽略系统默认的boost安装并且只使用本地安装,我认为这正是设置CPLUS_INCLUDE_PATH时所实现的和LD_LIBRARY_PATH,但对于后者,这似乎不成立。

那么如何确保使用g++ -o Test_boost_linking test_boost_linking.cpp -lboost_regex(不使用-L)使用本地库?

[编辑]进一步思考,我想知道如果绝对必须使用&#34; -L $ HOME / boost / lib&#34;在非标准目录中使用库时,在命令行中(使用LDFLAGS作为环境变量似乎没有效果,可能只是与Makefile结合使用)?是这种情况吗?

(顺便说一下,我认为这也适用于其他图书馆,不仅仅是提升...)

(我用过:g ++(Debian 4.4.5-8)4.4.5)

谢谢。

1 个答案:

答案 0 :(得分:3)

您需要使用环境变量LIBRARY_PATH让gcc知道链接时在哪里找到库。 LD_LIBRARY_PATH让程序知道在运行时在哪里找到动态库。这个answer有更多细节。 “GCC简介”中的这些链接也可能有用:Compilation options:Environment VariablesShared and Static Libraries