C++ 如何将字符串转换为目录?Linux上的boost

C++ 如何将字符串转换为目录?Linux上的boost,c++,linux,boost,boost-filesystem,C++,Linux,Boost,Boost Filesystem,在Linux上使用boost将路径转换为目录时遇到问题。下面是我的代码,这个目录存在于我的文件夹中,但不知何故没有被识别为目录,因为它总是打印输出路径不存在 我猜这是linux的问题,因为相同的代码在windows visual studio 2015上运行良好 #include <iostream> #include <boost/filesystem.hpp> using namespace std; int main() { boost::filesyst

在Linux上使用boost将路径转换为目录时遇到问题。下面是我的代码,这个目录存在于我的文件夹中,但不知何故没有被识别为目录,因为它总是打印输出路径不存在

我猜这是linux的问题,因为相同的代码在windows visual studio 2015上运行良好

#include <iostream>
#include <boost/filesystem.hpp>
using namespace std;
int main() 
{
    boost::filesystem::path p ("/home/dj/tut");
    cout <<p.generic_string()<<endl;
    if (boost::filesystem::is_directory(p)) { cout << "PATH EXISTS " << endl; }else { cout << "PATH DOES NOT EXISTS" << endl; }
}
然后执行以下操作以运行:

./test
通过
ldd测试
我得到:

linux-vdso.so.1 => (0x00007ffc8cdb9000) 
libboost_filesystem.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.58.0 (0x00007fef36573000)
libboost_system.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0 (0x00007fef3636f000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fef35fed000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fef35dd7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fef35a0d000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fef357f0000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fef354e7000) /lib64/ld-linux-x86-64.so.2 (0x00007fef3678b000) 

在这里,您只指定包含文件搜索路径,而不指定链接匹配库的
-L

g++ -I /home/dj/boost_1_65_1/boost script.cpp -o test -std=c++11 -lboost_filesystem -lboost_system
如果编译成功,那么链接器和运行时将使用Ubuntu的boost库。现在我不知道这怎么会产生你得到的效果,但是当你混合这样的版本时,有趣的事情会发生

尝试编译类似这样的内容(根据需要修复路径),以使链接器搜索您自己版本的libs:

g++ -I /home/dj/boost_1_65_1/boost script.cpp -o test -std=c++11 -L/home/dj/boost_1_65_1/boost -lboost_filesystem -lboost_system
然后,要在运行时使用正确的库,可以使用以下命令行(注意,单个命令行):


或者类似的东西,你会得到我希望的想法。

当你提到在windows上运行良好的代码时,这与变量
p
的值不同,对吗?如果输出只是“PATH NOT EXISTS”,那么当它被打印时,很明显p是空的。@lubgr是的,它与windows上的路径相同。路径是“\\tut”,但它在Linux上不起作用。据猜测,您的头文件来自Boost 1.65,但最终使用的库来自Ubuntu(因此,要旧得多)。我支持@hyde。事实上,这是值得回答的。OP,在编译/链接显示的命令后,您能用
ldd test
进行调查吗?嗯,在执行此命令后,它仍然不适用于我。我厌倦了重新安装我的Boost,我得到了如下:Boost C++库成功构建了!应将以下目录添加到编译器包含路径:/home/dj/boost_1_65_1应将以下目录添加到链接器库路径:/home/dj/boost_1_65_1/stage/lib这是否意味着我的boost安装正确?(尽管仍然不起作用)如果您将boost安装到主目录(而不是
/usr/lib
或其他目录),则它可能安装正确。正如所暗示的,有三件事需要考虑:正确的头文件(在编译期间使用,由
-I
设置),因此链接器检查库文件(在链接项目期间使用,由
-L
设置),最后是启动程序时使用的库(最方便的设置是通过环境变量
LD_LIBRARY_PATH
进行设置)。这些都必须匹配(或至少是兼容的版本),否则可能会发生有趣的事情(如果幸运的话,也可能只是一条错误消息)。如其他注释所述,ldd是用于检查运行时使用哪些.so文件的righ工具。如果不想在每个命令(如答案中所示)之前给出它,您还可以
导出LD_LIBRARY_PATH=…
。获得正确的输出:)我删除了我系统中的boost,这样它就停止了与系统bash的链接,并设法让它运行起来,哈哈哈,让我的系统运行起来,g++-I/home/dj/boost\u 1\u 65\u 1/boost script.cpp-o test-std=c++11-L/home/dj/boost\u 1\u 65\u 1/boost-lboost\u文件系统中的boost路径我需要链接到/home/dj/boost\u 1\u 65\u 1而不是/home/dj/boost\u 1\u 65\u 1/boost谢谢大家帮助我!!:D
g++ -I /home/dj/boost_1_65_1/boost script.cpp -o test -std=c++11 -L/home/dj/boost_1_65_1/boost -lboost_filesystem -lboost_system
LD_LIBRARY_PATH=/home/dj/boost_1_65_1/boost ./test