2013-06-07 52 views
24

プロジェクトでCMakeを使用していますが、いくつかのライブラリを静的にリンクしようとしています。CMakeと静的リンク

set(BUILD_SHARED_LIBS OFF) 
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") 
set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1) 

をそして、私は彼らの* .Aバージョンを持っている実際のライブラリを探していたとき、私は確信して作った: 私は設定しました。現在

プロジェクトのインポート:

libPocoNet.a 
libPocoUtil.a 
libPocoXML.a 
libPocoFoundation.a 
libmysqlclient.a 
libmysqlpp.a 
libcrypto++.a 
CUDA 

すべてのライブラリが発見され、ダイナミック/共有連携を行うとき、彼らは正常に動作。

set(GCC_CXX_FLAGS ${GCC_CXX_FLAGS} "-static-libgcc -static-libstdc++ -static") 

しかし、無駄に: 私はまた、コンパイルフラグを設定しようとしています。ないように特定の順序で

undefined reference to `mysql_thread_init' 
undefined reference to `mysql_real_query' 
undefined reference to `pthread_mutex_unlock' 
undefined reference to `Poco::ErrorHandler::handle()' 

を、各ライブラリーのための多数のエラー:コンパイル中に、私は何の問題を取得しませんが 、リンケージはすなわち、上記図書館で見つかったコールのために未定義参照のエラーをたくさん投げています。 GCCの最後の行を見ると

は、私が参照してください。

  1. なぜポコライブラリは-rdynamicとしてリンクされている、と何-Wl -Bstaticフラグはありません。私に不思議になり

    /usr/bin/c++ -g -g -static-libgcc -static-libstdc++ -static [list of *.cpp files] 
    -o icarus -rdynamic /usr/local/lib/libPocoFoundation.a /usr/local/lib/libPocoNet.a 
    /usr/local/lib/libPocoUtil.a /usr/local/lib/libPocoXML.a 
    -Wl,-Bstatic -lmysqlclient -lmysqlpp -lcrypto++ 
    

    ?あたかも静的リンケージからスキップ/除外されているかのように。

  2. はmysqlclient、静的リンク用に設定されているように見える++ mysqlppや暗号、まだ私はまだので、エラー

を取得し、誰かが私に説明してくださいできます

  1. I部分の静的リンクの設定を行う方法CMakeを使用する
  2. 設定する必要があるのはCMAKE_EXE_LINKER_FLAGSだけですか?
  3. 上記のライブラリでは静的リンクを強制するべきですが、プロジェクト全体では強制的にリンクする必要がありますか?

あまりにも多くの、またはあまりにもローカライズされた質問がある場合は、私はこれを試していない、と私はネット上の多くの情報を見つけるように見えることはできません。

答えて

24

私は私の問題を解決するために管理してきました

#Dynamic/Shared Libs 
... 
#Static start 
set_target_properties(icarus PROPERTIES LINK_SEARCH_START_STATIC 1) 
set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1) 
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 
#Static Libs 
... 
#Set Linker flags 
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") 

これは、-staticを経由しないで動作します基本的に静的ライブラリと動的ライブラリを混在させることができます。

静的ライブラリの順序が正しい限り、静的ライブラリの依存関係が満たされている限り、私は動的(つまり、私の場合はmysqlclient、libmysql ++)と静的なものをロードするELFを取得します(暗号++、PocoNet、PocoUtil、PocoXML、PocoFoundation)。

静的リンクライブラリには独自の依存関係があることに注意してください。 はこれが正しいならば、私はまだ気づいていないよなど、

Dynamic section at offset 0x508f88 contains 28 entries: 
    Tag  Type       Name/Value 
0x0000000000000001 (NEEDED)    Shared library: [libmysqlpp.so.3] 
0x0000000000000001 (NEEDED)    Shared library: [libmysqlclient.so.18] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [ld-linux-x86-64.so.2] 
0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 

私はpthreadのはポコによってインポートされていることを知っている:: Runnableを、のlibmは数学演算のためにある:readelfが-dアプリを使用して、私のデバッグアプリケーションを調べると、私が見ます部分静的リンクのためにCMakeを使用する方法。

crypto ++、mysql ++、mysqlclientなどのDebianパッケージ化されたライブラリの場合は、単に* .aライブラリを検索するだけですが、Pocoライブラリの場合はライブラリの完全なパスと名前しか取得できませんフラグではなく、-Bdynamicは上記の行を使用してのみオフにすることができます。

注:ポコは、私は、これは誰もが同じような何かで立ち往生役に立てば幸い-static-libstdc++

せずに、静的にリンクすることができませんでした。

+0

"/ usr/bin/ld:CentOS 7でビルドできません" –

+0

@MikeM Cライブラリがインストールされていないとは思えません。おそらく、あなたのライブラリのパスをエクスポートする必要がありますか? –

+0

移植性を気にするならば、私は良いファイルではないので、私はadd_library(..)を通して.aファイルへのパスをハードコーディングしてしまいました。それは私のために働いていました(ヘッダと静的ライブラリの両方に) –

11

どのように私はCMakeの

を使用して、静的リンクのためのセットアップうーん...あなたはそれはcmakeのがどのように動作するかではありません:)ませんか:CMakeの中で、あなたが最初のライブラリの絶対パスを見つけ、 target_link_librariesでリンクします。

あなたは、静的ライブラリにリンクしたいのであれば、あなたはその静的ライブラリを検索する必要があります。

find_library(SOMELIB libsomelib.a) 

の代わり:

find_library(SOMELIB somelib) 
+0

もう一度!それは私がやっていることです。* .aを探してそれらを手に入れます。そして、それは私がまだリンクエラーを得る方法です。代わりに、各静的ライブラリの絶対パスをリンカに送るべきですか? –

+0

ええ、CMakeは絶対パスを期待しています。それはfind_libraryがあなたに与えるべきものです。 – Guillaume

+0

それは私が得るものです。 cmakeを実行しているときに、ライブラリ名を記録しています。実際の静的ライブラリへのシンボリックリンクであるフルパスと* .aを見ることができます。それでも、参照のないエラーについては説明しませんが、それはどうですか?これらのエラーは図書館の中から来ているようです。各ライブラリの依存関係もインポートする必要がありますか? –

関連する問題