我想在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)
谢谢。
答案 0 :(得分:3)
您需要使用环境变量LIBRARY_PATH
让gcc知道链接时在哪里找到库。 LD_LIBRARY_PATH
让程序知道在运行时在哪里找到动态库。这个answer有更多细节。 “GCC简介”中的这些链接也可能有用:Compilation options:Environment Variables和Shared and Static Libraries