2012-02-28 12 views
0

このサンプルコードはあります。静的なブーストファイルシステムを構築できません

#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 

は、どのように私はそれを修正するのですか?

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

実行時リンカーは共有をロードするためにトポロジカル依存関係の並べ替えを行いますので、これは次のとおりです。boost_filesystemboost_systemに依存するためのおかげ

答えて

1

はおそらく、成功するために静的リンクのためのあなたのライブラリの順序を逆にする必要がありますライブラリは正しい順序で、静的リンクはそれをしません。

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 

また、あなたは残りの未定義シンボルを解決しようとするライブラリのリストの上にいくつかのパスを行うには静的リンクを強制することができます

関連する問題