Не могу построить статическую файловую систему boost - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть этот пример кода.

#include <iostream>
#include <boost/filesystem.hpp>
using namespace std;

int main()
{
  return 0;
}

Его можно правильно построить с помощью: g++ -lboost_system-mt -lboost_filesystem-mt 1.cpp

Но если я добавлю -static, то он жалуется:

/tmp/cc1JEbRQ.o: In function `__static_initialization_and_destruction_0(int, int)':
1.cpp:(.text+0xb0): undefined reference to `boost::system::get_system_category()'
1.cpp:(.text+0xba): undefined reference to `boost::system::get_generic_category()'
1.cpp:(.text+0xc4): undefined reference to `boost::system::get_generic_category()'
1.cpp:(.text+0xce): undefined reference to `boost::system::get_generic_category()'
1.cpp:(.text+0xd8): undefined reference to `boost::system::get_system_category()'
collect2: ld returned 1 exit status

Как мне это исправить? Спасибо

1 Ответ

1 голос
/ 29 февраля 2012

Вероятно, вам нужно изменить порядок своих библиотек, чтобы статическое связывание было успешным, потому что boost_filesystem зависит от boost_system:

g++ 1.cpp -static -lboost_filesystem-mt -lboost_system-mt

Это потому, что компоновщик во время выполнения выполняет топологическую зависимостьСортировка для загрузки разделяемых библиотек в правильном порядке, тогда как статическое связывание этого не делает.

В качестве альтернативы, вы можете заставить статическое связывание выполнить несколько проходов по списку библиотек, чтобы попытаться разрешить оставшиеся неопределенные символы:

man 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.

Например:

g++ 1.cpp -static -Wl,--start-group -lboost_system-mt -lboost_filesystem-mt -Wl,--end-group
...