Я пытаюсь настроить библиотеку OpenDDS для Windows 11 и Visual Studio 2022.
Я запустил файл конфигурации через командную строку Visual Studio и получил следующую ошибку.
Downloading ACE+TAO 2.2a with latest patches
Extracting archive ACE+TAO-2.2a_with_latest_patches_NO_makefiles.zip
Use of uninitialized value $prop_value in scalar chomp at configure line 473.
Couldn't get submodule.tools/rapidjson.openddsConfigureCommit from .gitmodules
Stopped at configure line 475.
ERROR: configure failed with errorcode 1
Файл configure.cmd имеет следующий код
@echo off
:: Win32 configure script wrapper for OpenDDS
:: Distributed under the OpenDDS License.
:: See: http://www.opendds.org/license.html
for %%x in (perl.exe) do set PERLPATH=%%~dp$PATH:x
if "x%PERLPATH%"= = "x" (
echo ERROR: perl.exe was not found. This script requires Perl.
exit /b 1
)
set PERLPATH=
perl configure %*
if %ERRORLEVEL% NEQ 0 (
echo ERROR: configure failed with errorcode %errorlevel%
exit /b %errorlevel%
)
if exist setenv.cmd call setenv.cmd
И я считаю, что файл конфигурации с perl находится здесь https://github.com/objectcomputing/OpenDDS/blob/master/configure
Я сделал перекрестную ссылку на этот вопрос «Использование неинициализированного значения в скалярном chomp» в Perl, но я, к сожалению, не пишу код на Perl, поэтому не знаю, как решить эту проблему.
Речь идет об дескрипторе файла канала, который не смог прочитать то, что он должен был прочитать, как описано в коде, который вы связали. Строка 473 находится внутри этой относительно короткой подпрограммы:
sub git_submodule_prop {
my $path = shift;
my $prop_name = shift;
my $full_prop_name = "submodule.$path.$prop_name";
open(my $fd, "-|", "git config --file .gitmodules --get $full_prop_name")
or die("git_submodule_prop open failed: $!\nStopped");
my $prop_value = <$fd>;
close($fd);
chomp($prop_value);
if (!$prop_value) {
die("Couldn't get $full_prop_name from .gitmodules\nStopped");
}
return $prop_value;
}
Сообщение об ошибке не говорит ничего особо примечательного, за исключением того, что функция chomp
используется для неопределенного значения. Под ним находится «настоящее» сообщение об ошибке:
Couldn't get submodule.tools/rapidjson.openddsConfigureCommit from .gitmodules
Stopped at configure line 475.
В коде вы можете видеть, что он пытается открыть канал к процессу git
, который, по-видимому, открылся (потому что он там не умер), но затем ничего не читает из дескриптора файла.
my $prop_value = <$fd>;
Что затем приводит к тому, что код умирает.
if (!$prop_value) {
die("Couldn't get $full_prop_name from .gitmodules\nStopped");
}
Возможно, вам нужно исследовать, почему процесс git
ничего не читал из пайпа.
@FredHornsey Хорошо, что вы все исправили, ура.
Как упоминал @TLP https://stackoverflow.com/a/74026678/8869703, это действительно был сбой с git.
Сжатый файл от OpenDDS не содержал git-пакета, поэтому я не мог полагаться на файл с https://opendds.org/downloads.html.
Я выполнил следующие шаги, которые нашел в комментариях @simpsont-oci здесь https://github.com/objectcomputing/OpenDDS/discussions/3784:
git clone https://github.com/objectcomputing/OpenDDS.git
git submodule init
git submodule update
configure
Это сработало для меня.
Автор кода, о котором идет речь здесь, я думаю, что это исправлено. Это была странная ошибка, связанная с тем, как работает Perl в Windows: github.com/objectcomputing/OpenDDS/pull/3812