Сценарий запуска примера UVM-SystemC не работает

Я разработал perl-скрипт для запуска примеров кода UVM-SystemC.

#!/usr/bin/perl

use warnings;
use strict;

sub main();


my $CLIBS = "\$SYSTEMC_HOME/lib-linux64";
my $UVMCLIBS = "\$UVMSYSTEMC_HOME/lib-linux64";

my $CINC = "\$SYSTEMC_HOME/include";
my $UVMCINC = "\$UVMSYSTEMC_HOME/include";

main();



sub main(){

    eval{
        $ARGV[0];
    }or do{
        print("\n\tRun the script with SystemC <filename> as argument\n\n");
        exit 1;
    };

    system "g++ -I$CINC -I$UVMCINC -L$CLIBS -lsystemc -L$UVMCLIBS -luvm-systemc $ARGV[0] -Wl,-rpath,$CLIBS -Wl,-rpath,$UVMCLIBS";

    #system "./sim";

}

Здесь переменные $ указывают на соответствующие пути установки SystemC и UVM-SystemC. И сценарий ожидает файл *.cpp в качестве аргумента для $ARGV[0]. Примеры команд обеих библиотек работают правильно с помощью make check, но сценарий выдает ошибку. Подробный журнал ошибок error.log


person MayurKubavat    schedule 22.07.2016    source источник


Ответы (2)


Возможно ли, что библиотеки SystemC и UVM были скомпилированы с более старой версией g++, чем та, которая используется вашим скриптом? Подозреваю, что из-за этих ошибок:

undefined reference to `uvm::uvm_report_warning(std::__cxx11::basic_string<char, std::char_traits<char>**, ...etc..
undefined reference to `uvm::uvm_typeid_base::type_name[abi:cxx11]'

Похоже, что библиотеки могли быть скомпилированы с помощью gcc 4.x, тогда ваш скрипт выполняет gcc 5.x, который использует новый ABI:

https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

Проверьте, какая у вас версия g++ на вашем пути: g++ --version

person Mr Bone    schedule 22.07.2016
comment
Вывод g++ --version равен g++ (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609. В журналах конфигурации библиотеки uvm-systemc используется та же версия g++. - person MayurKubavat; 23.07.2016
comment
Как насчет библиотеки SystemC? Он скомпилирован с тем же? Если какая-либо библиотека, необходимая вашему исполняемому файлу, была скомпилирована с помощью gcc 4.x, могут возникнуть несовместимости с ABI. Вы можете попробовать перекомпилировать исполняемый файл и библиотеку uvm-systemc со старым ABI: добавьте -D_GLIBCXX_USE_CXX11_ABI=0 в командную строку CXXFLAGS или g++. - person Mr Bone; 25.07.2016
comment
Это все еще дает ту же ошибку. И make check в uvm-systemc/objdir работает нормально и имитирует все примеры. Единственное, я не могу запустить его со скриптом. - person MayurKubavat; 10.08.2016

Ошибка выглядит так, будто включаемые файлы отсутствуют. это в основном потому, что системная команда в сценарии не передала правильные переменные. Perl-скрипт использует $SYSTEMC_HOME, угадывание которого является переменной env, но не использует $ENV для ее чтения. используйте $ENV{'SYSTEMC_HOME'}, чтобы получить значение, установленное в переменной env оболочки.

my $CLIBS = "$ENV{'SYSTEMC_HOME'}/lib-linux64";

ссылки на то, как получить доступ к системным переменным в perl. http://alvinalexander.com/perl/edu/articles/pl020002

Также распечатайте системную строку для подтверждения настроек.

   print "g++ -I$CINC -I$UVMCINC -L$CLIBS -lsystemc -L$UVMCLIBS -luvm-systemc $ARGV[0] -Wl,-rpath,$CLIBS -Wl,-rpath,$UVMCLIBS";
person Rahul Menon    schedule 23.07.2016
comment
Привет, Рахул, я не думаю, что это проблема. Чтобы подтвердить, что я попробовал ваше предложение. Я все еще получаю ту же ошибку. Печать показывает соответствующий путь. - person MayurKubavat; 23.07.2016