Статическая ссылка общей библиотечной функции в gcc

Используя идею, опубликованную ckuri , и включая улучшения, предложенные Эриком Липпертом , вы можете сгруппировать список чисел по суффиксу:

var prefixLength = 100;
var suffixLength = 10000;

 Enumerable
  .Range(0, prefixLength * suffixLength)
  .OrderBy(number => rnd.Next())
  .GroupBy(number => number % suffixLength)

Тогда , вы можете сгладить список:

Enumerable
 .Range(0, prefixLength * suffixLength)
 .OrderBy(number => rnd.Next())
 .GroupBy(number => number % suffixLength)
 .SelectMany(g => g)

До этого момента у вас будет список чисел, где в каждых 100 строках (prefixLength) префиксы будут одинаковыми. Таким образом, вы можете выбрать их, получив индекс каждой строки:

Enumerable
 .Range(0, prefixLength * suffixLength)
 .OrderBy(number => rnd.Next())
 .GroupBy(number => number % suffixLength)
 .SelectMany(g => g)
 .Select((g, index) => new { Index = index, Number = g })

Используя информацию об индексе, вы можете сгруппировать строки, применяя функцию мода, используя prefixLength как фактор:

[113 ]

Наконец, вы можете снова сгладить список и преобразовать значения в строку, чтобы получить окончательный результат:

Enumerable
 .Range(0, prefixLength * suffixLength)
 .OrderBy(number => rnd.Next())
 .GroupBy(number => number % suffixLength)
 .SelectMany(g => g)
 .Select((g, index) => new { Index = index, Number = g })
 .GroupBy(g => g.Index % prefixLength, g => g.Number)
 .SelectMany(g => g)
 .Select(number => $"{number/suffixLength:d2}{number%suffixLength:d4}")

126
задан Welbog 7 April 2009 в 12:45
поделиться

3 ответа

Обратитесь к:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

Вам нужна статическая версия библиотеки для соединения.

Общая библиотека является на самом деле исполняемым файлом в специальном формате с указанными точками входа (и некоторые липкие включенные проблемы обращения). Это не имеет всей информации, должен был связаться статически.

Вы не можете статически связать совместно использованную библиотеку (или динамично связаться статичный),

Флаг - статичный вынудит компоновщика пользоваться статической библиотекой (.a) вместо общего (.so), Но. Статические библиотеки, не всегда устанавливаемые по умолчанию. Таким образом, при необходимости в статической ссылке, необходимо установить статические библиотеки.

Другой возможный подход является использованием statifier или Горностаем. Оба инструмента берут в качестве входа, динамично связал исполняемый файл и поскольку вывод создает автономный исполняемый файл со всеми общими встроенными библиотеками.

99
ответ дан 24 November 2019 в 00:53
поделиться

В gcc это не поддерживается. На самом деле это не поддерживается ни в каком существующем компиляторе/компоновщике, о котором я знаю.

0
ответ дан 24 November 2019 в 00:53
поделиться

Если вы хотите связать, скажем, libapplejuice статически, но не, скажем, liborangejuice , вы можете связать так:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

Там предостережение - если liborangejuice использует libapplejuice , то libapplejuice также будет динамически связан.

Вам нужно связать liborangejuice статически вместе с libapplejuice , чтобы получить статический libapplejuice .

И не забудьте сохранить -Wl, -Bdynamic иначе вы в конечном итоге свяжете все статическое, включая libc (что нехорошо).

74
ответ дан 24 November 2019 в 00:53
поделиться