Ошибка компиляции примера кода gtkmm2.4 на solaris10

#c #c 11 #solaris #gtkmm #glibmm

#c #c 11 #solaris #gtkmm #glibmm

Вопрос:

При попытке скомпилировать пример кода gtkmm на моем компьютере Solaris10 я получаю некоторую ошибку во время компиляции в заголовке glibmm/variant.h.

Конфигурация системы выглядит следующим образом:

 > uname -a
> SunOS selix570bx 5.10 Generic_150401-04 i86pc i386 i86pc
  

Версия компилятора, как показано ниже:

 > CC -V
> CC: Sun C   5.8 2005/10/13
  

Исходный код (sample.cc ), как показано ниже:

 #include <gtkmm.h>

int main(int argc, char *argv[])
{
    Gtk::Main kit(argc, argv);

    Gtk::Window window;

    Gtk::Main::run(window);

    return 0;
}
  

Команда для компиляции исходного кода выглядит следующим образом:

 > CC -library=stlport4 sample.cc -o sample `pkg-config gtkmm-2.4 --cflags --libs`
  

Вывод команды pkg-config приведен ниже для справки:

 > pkg-config gtkmm-2.4 --cflags --libs
> -I/opt/csw/include/gtkmm-2.4 -I/opt/csw/lib/gtkmm-2.4/include -I/opt/csw/include/atkmm-1.6 -I/opt/csw/include/giomm-2.4 -I/opt/csw/lib/giomm-2.4/include -I/opt/csw/include/pangomm-1.4 -I/opt/csw/lib/pangomm-1.4/include -I/opt/csw/include/gtk-2.0 -I/opt/csw/include/gtk-unix-print-2.0 -I/opt/csw/include/gdkmm-2.4 -I/opt/csw/lib/gdkmm-2.4/include -I/opt/csw/include/atk-1.0 -I/opt/csw/include/glibmm-2.4 -I/opt/csw/lib/glibmm-2.4/include -I/opt/csw/include/glib-2.0 -I/opt/csw/lib/glib-2.0/include -I/opt/csw/include/sigc  -2.0 -I/opt/csw/lib/sigc  -2.0/include -I/opt/csw/include/cairomm-1.0 -I/opt/csw/lib/cairomm-1.0/include -I/opt/csw/include/pango-1.0 -I/opt/csw/include/cairo -I/opt/csw/lib/gtk-2.0/include -I/opt/csw/include/gdk-pixbuf-2.0 -I/opt/csw/include/freetype2 -I/opt/csw/include  -L/opt/csw/lib -lgtkmm-2.4 -latkmm-1.6 -lgdkmm-2.4 -lgiomm-2.4 -lpangomm-1.4 -lgtk-x11-2.0 -lglibmm-2.4 -lcairomm-1.0 -lsigc-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -lintl
  

Ниже приведена ошибка, которую я получаю при компиляции моего примера кода gtkmm:

 "/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1277: Error: Glib::Variant<Glib::T>::Variant() is not a member of Glib::Variant<Glib::T>.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1283: Error: Multiple declaration for<no tag>.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1296: Error: Templates can only declare classes or functions.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1300: Error: A declaration was expected instead of "return".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1301: Error: A declaration was expected instead of "}".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1304: Error: Templates can only declare classes or functions.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1307: Error: A declaration was expected instead of "return".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1307: Error: Template Variant is not defined.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1308: Error: A declaration was expected instead of "}".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1314: Error: Templates can only declare classes or functions.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1320: Error: A declaration was expected instead of "return".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1321: Error: A declaration was expected instead of "}".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1324: Error: Templates can only declare classes or functions.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1328: Error: Multiple declaration for Variant.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1328: Error: Template Variant is not defined.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: Multiple declaration for Variant.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: Template Variant is not defined.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: Use ";" to terminate declarations.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: A declaration was expected instead of ",".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: "," expected instead of ">".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: Use ";" to terminate declarations.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: A declaration was expected instead of ",".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: Multiple declaration for V.
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1330: Error: "," expected instead of ">".
"/opt/csw/include/glibmm-2.4/glibmm/variant.h", line 1333: Error: A declaration was expected instead of "return".
Compilation aborted, too many Error messages.
  

Ранее я получил еще несколько сообщений об ошибках, включая вышеуказанные ошибки, но большинство из этих ошибок исчезли, включив -library=stlport4 .

Теперь, эти ошибки вызваны тем, что мой компилятор не поддерживал c 11, поскольку я использую более старую систему solaris10. Но я выбираю gtkmm2.4, потому что я думал, что он работает и с более старой версией компилятора C . Также я попытался проверить, если я использую более новую версию glibmm. Но установленный в настоящее время glibmm доступен только в диспетчере пакетов для моей системы.

Не уверен, где искать дальше, чтобы решить эту проблему. Любые предложения.

Ответ №1:

Проблема была решена путем внесения следующих изменений:

Я установил последнюю версию g , доступную для моей системы Solaris, используя приведенную ниже команду:

 > /opt/csw/bin/pkgutil -a | grep g  
gcc4g                CSWgcc4g             4.9.2,REV=2014.11.07        41.9 MB
gcc5g                CSWgcc5g             5.2.0,REV=2015.07.31        57.2 MB
> /opt/csw/bin/pkgutil -i -y gcc5g  
  

Он установил несколько библиотек и новый g в каталог /opt/csw/gcc5/bin/ .
Теперь вместо использования компилятора Sun Solaris я использовал этот новый компилятор g , и все работало нормально.

Но перед компиляцией с помощью g я должен установить LD_LIBRARY_PATH, как показано ниже:

 setenv LD_LIBRARY_PATH /opt/csw/lib
  

Как и в случае с новым компилятором g , также были загружены некоторые библиотеки, которые были размещены в вышеуказанном каталоге.

Ура. 🙂

Комментарии:

1. Смешивание компиляторов C — как вы делали в -library=stlport4 сочетании с используемой вами версией GTK, построенной, по-видимому, на g , — обычно работает плохо. Более поздние версии компилятора Sun / Oracle Studio утверждают, что они совместимы с двоичным кодом с g . См . docs.oracle.com/cd/E60778_01/html/E60746/bkana.html#OSSCPgnaof

2. Поэтому, если в будущем я буду использовать последнюю версию компилятора Sun Studio с встроенной версией GTK на g , она будет работать нормально. Также некоторые из моих двоичных файлов приложений созданы с помощью компилятора Sun Studio, который я, возможно, захочу использовать из этого приложения GTK, созданного с использованием g , это нормально.

3. Теоретически, да. Однако обратите внимание на формулировку «он совместим с двоичным кодом с g в Oracle Solaris и Oracle Linux «. Это вполне может означать, что компилятор Oracle Studio будет гарантированно совместим только с версией g , которую Oracle предоставляет со своими операционными системами.