Mono / Ubuntu — конфликтующие определения

#c# #.net #linux #ubuntu #mono

#c# #.net #linux #ubuntu #mono

Вопрос:

Я пытаюсь создать библиотеку (Medsphere.Виджеты) в Ubuntu, и это выдает мне ошибку. У меня был хороший поиск, но, похоже, ни у кого нет ответа на него. Сценарий настройки работает нормально и завершается без предупреждений или ошибок. Когда я иду запускать make, он делает это:

 polynomial@ubuntu:~/Projects/Medsphere/$ make
Making all in src
make[1]: Entering directory `/home/polynomial/Projects/Medsphere/src'
/usr/bin/mcs /target:library /out:Medsphere.Widgets.dll -r:/usr/lib/pkgconfig/../../lib/cli/pango-sharp-2.0/pango-sharp.dll -r:/usr/lib/pkgconfig/../../lib/cli/atk-sharp-2.0/atk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/cli/gdk-sharp-2.0/gdk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/cli/gtk-sharp-2.0/gtk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/cli/glib-sharp-2.0/glib-sharp.dll   -r:/usr/lib/mono/2.0/Mono.Cairo.dll    ./CPaned.cs ./FBox.cs ./GridView.cs ./CairoHelper.cs ./IconLayout.cs ./ICairoCellRenderer.cs ./BoxCellRenderer.cs ./PixbufCellRenderer.cs ./TextCellRenderer.cs ./graph/AxisLocation.cs ./graph/AxisSizeGroup.cs ./graph/BaseTreeModelPlot.cs ./graph/DateTimeAxis.cs ./graph/EventPlot.cs ./graph/Graph2D.cs ./graph/Graph.cs ./graph/GtkStyleProvider.cs ./graph/HistogramPlot.cs ./graph/IAxis.cs ./graph/IPlot.cs ./graph/IStyleProvider.cs ./graph/ITreeModelPlot.cs ./graph/LabelAxis.cs ./graph/Legend.cs ./graph/LinearAxis.cs ./graph/LinePlot.cs ./graph/LinkedLinePlot.cs ./graph/PlotColor.cs ./graph/PointShape.cs ./graph/ReferenceRangePlot.cs
./IconLayout.cs(414,25): error CS0029: Cannot implicitly convert type `Cairo.Context' to `Cairo.Context'
./IconLayout.cs(414,25): The type `Cairo.Context' has two conflicting definitions, one comes from `Mono.Cairo, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756' and the other from `Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756' (in the previous error)
Internal(1,1): The type `Cairo.Context' has two conflicting definitions, one comes from `Mono.Cairo, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756' and the other from `Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756' (in the previous error)
./IconLayout.cs(920,41): error CS1502: The best overloaded method match for `Gdk.CairoHelper.SetSourceColor(Cairo.Context, Gdk.Color)' has some invalid arguments
/usr/lib/cli/gdk-sharp-2.0/gdk-sharp.dll (Location of the symbol related to previous error)
./IconLayout.cs(920,41): error CS1503: Argument `#1' cannot convert `Cairo.Context' expression to type `Cairo.Context'
./IconLayout.cs(920,41): (equally named types possibly from different assemblies in previous error)
/usr/lib/mono/gac/Mono.Cairo/2.0.0.0__0738eb9f132ed756/Mono.Cairo.dll (Location of the symbol related to previous error)
/usr/lib/mono/gac/Mono.Cairo/1.0.5000.0__0738eb9f132ed756/Mono.Cairo.dll (Location of the symbol related to previous error)
Compilation failed: 3 error(s), 0 warnings
  

Я могу только представить, что две версии Cairo конфликтуют, но я не могу понять, как это исправить. Есть идеи?

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

1. Хм, выглядит странно. Глобальный кэш сборки должен понимать, что это одна и та же библиотека для разных версий CLR, и выбрать одну.

2. Извините, я имел в виду mcs . Не уверен, почему я пометил его gcc . Переназначен соответствующим образом.

3. Я попытался заменить все экземпляры /usr/lib/mono/Mono.Cairo.dll на /usr/lib/mono/gac/Mono.Cairo/2.0.0.0__0738eb9f132ed756/Mono.Cairo.dll , но это не помогло.

4. эта вещь должна использовать опцию -pkg для компилятора, компилятор mono обычно игнорирует GAC btw.

5. Удалось исправить это самостоятельно. Я изменил config.status для использования gmcs и исправил все Mono. Ссылки Cairo так, чтобы они указывали на DLL, зависящую от версии. После исправления пары ошибок приведения в библиотеку, она отлично работает!

Ответ №1:

Просто чтобы прояснить это:

Я изменил config.status для использования gmcs , а не просто mcs исправил все Mono.Cairo ссылки, чтобы они указывали на DLL, зависящую от версии, а не на общую в GAC. После исправления пары ошибок приведения в библиотеку, она отлично работает!