У меня есть программа на C++, где мне нужен текущий путь для последующего создания папки. Расположение моего исполняемого файла, скажем, /home/me/foo/bin
. Это то, что я запускаю:
//Here I expect '/home/me/foo/bin/', but get ''
auto currentPath = boost::filesystem::current_path();
//Here I expect '/home/me/foo/', but get ''
auto parentPath = currentPath.parent_path();
//Here I expect '/home/me/foo/foo2/', but get 'foo2/'
string subFolder = "foo2";
string folderPath = parentPath.string() + "/" + subFolder + "/";
//Here I expect to create '/home/me/foo/foo2/', but get a core dump
boost::filesystem::path boostPath{ folderPath};
boost::filesystem::create_directories( boostPath);
Я работаю на Ubuntu 16.04, используя Boost 1.66, установленный с менеджером пакетов Conan.
Раньше я успешно запускал это с предыдущей версией Boost (я полагаю, 1.45) без использования Conan. Boost был просто установлен на моей машине. Теперь я получаю дамп ядра при запуске create_directories( boostPath);
.
Два вопроса:
- Почему
current_path()
не предоставляет мне фактический путь, а вместо этого возвращает и пустой путь? - Даже если current_path() ничего не возвращает, почему у меня все еще есть дамп ядра, даже если я запускаю его с
sudo
? Разве я не мог бы просто создать папку (папки) в корне?
Изменить:
Запуск скомпилированной программы с некоторыми cout
выводами вышеуказанных переменных между строками, а не с использованием режима отладки, обычно дает мне следующий вывод:
currentPath: ""
parentPath: ""
folderPath: /foo2/
Segmentation fault (core dumped)
Но иногда (примерно в 20% случаев) выдает следующий результат:
currentPath: "/"
parentPath: "/home/me/fooA�[oFw�[oFw@"
folderPath: /home/me/fooA�[oFw�[oFw@/foo2/
terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
what(): boost::filesystem::create_directories: Invalid argument
Aborted (core dumped)
Редактировать 2:
Запустив conan profile show default
, я получаю:
[settings]
os=Linux
os_build=Linux
arch=x86_64
arch_build=x86_64
compiler=gcc
compiler.version=5
compiler.libcxx=libstdc++
build_type=Release
[options]
[build_requires]
[env]
sudo run
и добавив несколькоcout
между строками для печати путей на консоли. Результаты были такими же. - person raggot   schedule 03.09.2018sudo run
вы подразумеваете запуск скомпилированного исполняемого файла с помощьюsudo
? Попробуйте напрямую позвонитьgetcwd()
и проверитьerrno
, чтобы узнать, что может пойти не так. - person A. Gille   schedule 03.09.2018conan install
совпадают с настройками сборки. Например, профиль по умолчанию (.conan/profiles/defaul илиconan profile show default
) используетlibcxx=libstdc++
из соображений обратной совместимости. Но ваш компилятор может использоватьlibcxx=libstdc++11
по умолчанию. Обычно это означает ошибки ссылок, а не время выполнения, но проверьте на всякий случай. - person drodri   schedule 03.09.2018conan profile show default
к моему вопросу, и это действительно так, как вы догадались. Однако я не знаю, как проверить, что использует мой компилятор. Не могли бы вы дать мне ссылку, чтобы узнать, как его найти? - person raggot   schedule 03.09.2018home/me/foo/
. На самом деле я ожидалhome/me/foo/bin/
, где находится мой скомпилированный код, но, по крайней мере, мы знаем, что я в правильном месте, и чтоcurrent_path()
дает мне совершенно неправильный результат. - person raggot   schedule 03.09.2018[env]
выглядит очень сильным кандидатом на то, чтобы быть моей проблемой. Попробую настроить правильно. - person raggot   schedule 03.09.2018libstdc++11
в качестве libcxx по умолчанию и попытался сноваconan install
ваши зависимости, а затем пересобрать ваше приложение. Обычно g++›5 будет использоватьlibstdc++11
в современных дистрибутивах. Старый компилятор и старые дистрибутивы будут использоватьlibstdc++
. - person drodri   schedule 03.09.2018current_path
сообщает вам рабочий каталог, который не обязательно является местоположением исполняемого файла. - person John Zwinck   schedule 03.09.2018