Как сделать так, чтобы gcc / ld перебирал множество библиотек -l при использовании -static? - PullRequest
1 голос
/ 19 января 2012

Я хочу статически скомпилировать pdf2svg, чтобы иметь возможность использовать новейшую версию в стабильном Debian.Параметр ./configure не дает --enable-static, поэтому я добавил вручную в параметре Makefile -static для компоновщика.

К сожалению, результат оказался не совсем таким, как я подозревал.Связывание дало мне огромное количество undefined reference ошибок.После некоторого поиска я понял, что проблема вызвана неправильным порядком -lsome_lib.Линкер Gcc пытается статически связать каждую библиотеку один раз, когда он впервые видит ее - info и вопрос Stackoverflow: Почему порядок, в котором библиотеки связаны, иногда вызывает ошибки в GCC? .

Есть ли возможность заставить компоновщик делать несколько проходов по списку библиотек?

Ответы [ 2 ]

9 голосов
/ 19 января 2012

Может быть, это то, что вы ищете (из man-страницы gnu ld):

   -( archives -)
   --start-group archives --end-group
       The archives should be a list of archive files.  They may be either explicit file names, or -l options.

       The specified archives are searched repeatedly until no new undefined references are created.  Normally, an archive is searched only once in the order that it is
       specified on the command line.  If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on
       the command line, the linker would not be able to resolve that reference.  By grouping the archives, they all be searched repeatedly until all possible references
       are resolved.

       Using this option has a significant performance cost.  It is best to use it only when there are unavoidable circular references between two or more archives.
0 голосов
/ 07 июня 2013

Галочка, по возможности, добавляет статическую ссылку на объект класса (или на функцию), которые не были связаны в другом файле cpp той же библиотеки (или в другой уже используемой библиотеке).

У меня такая ситуация:

  • библиотека A с классом clsA в clsA.cpp, который выдает ошибку
  • библиотека A с foo.cpp, которая не дает ошибок ссылок
  • библиотека B, использующая класс clsA
  • Приложение использует обе библиотеки и использует классы / функции из foo.cpp

Я получаю неразрешенную ссылку в приложении при использовании объекта в библиотеке B, который использует класс clsA.

Связывание приложения с библиотеками A и B выдает мне ошибку. Так как я использую CodeLite, трудно изменить порядок библиотек. Я просто помещаю статический объект в foo.cpp:

#include "clsA.h"
clsA objA;

Теперь компоновщик видит, что ссылки на clsA находятся в библиотеке A (между foo.cpp) и будут правильно связываться в приложении, поскольку файл foo.cpp уже был связан.

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

// foo.cpp
#include "clsA.h"
void dummyf()
{
   clsA objA;
}
...