3

除了在系统范围内安装默认的 boost 库之外,我还想在本地安装 boost C++ 库(在我的主文件夹(Linux)中,比如 $HOME/boost )。我从sorce构建它们并且效果很好。

之后,我设置了环境变量 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 时所实现的,但对于后者,这似乎不成立。

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

[编辑] 进一步考虑,我想知道是否真的必须在命令行中使用“-L$HOME/boost/lib”(使用 LDFLAGS 作为环境变量似乎没有效果,可能只是结合使用使用Makefile)在非标准目录中使用库时?是这样吗?

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

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

谢谢你。

4

1 回答 1

3

您需要使用环境变量LIBRARY_PATH让 gcc 在链接时知道在哪里可以找到库。LD_LIBRARY_PATH让程序知道在运行时在哪里可以找到动态库。这个答案有更多细节。“GCC 简介”中的这些链接也可能有用:编译选项:环境变量以及共享库和静态库

于 2012-07-25T08:01:47.190 回答