2016-08-31 17 views
1

私のプログラムを別の静的ライブラリと静的にコンパイルしたいのですが、この例ではzeromqを使用しています。CMakeは `/ usr/local/lib`の` .a`ファイルを動的にリンクします

/usr/bin/c++ CMakeFiles/test.dir/test.cpp.o \ 
    -o test -rdynamic /usr/local/lib/libzmq.a 

:私はmkdir build && cd build && cmake ..

-- /usr/local/lib/libzmq.a 

を実行したときにここに私のCMakeLists.txt

cmake_minimum_required(VERSION 2.6) 
add_executable(test test.cpp) 
find_library(ZMQ NAMES libzmq.a) 
message(STATUS ${ZMQ}) 
target_link_libraries(test ${ZMQ}) 

があるそれは私がlink.txtファイルを調べる場合は、ライブラリーを動的にリンクされ.aファイルを検索します奇妙なことに、ファイルを別のディレクトリに移動すると、/usr/libと答えてcmake ..もう一度、それはライブラリへの新しいパス探し出し:

-- /usr/lib/libzmq.a 

をしかし、今では魔法の静的リンクに変更されました:

/usr/bin/c++ CMakeFiles/test.dir/test.cpp.o \ 
    -o test -rdynamic -Wl,-Bstatic -lzmq -Wl,-Bdynamic 

同じことは、私はにリンクしてる他のライブラリに適用されます。

/usr/local/libのすべてのライブラリが動的にリンクされているのはなぜですか?

答えて

2

あなたは明示的に静的に宣言することができますので、あなたは、直接パスを使用して、代わりにimported targetを作成しないでください。

cmake_minimum_required(VERSION 2.6) 
add_executable(test test.cpp) 

find_library(zmq_location NAMES libzmq.a) 
message(STATUS ${zmq_location}) 

add_library(zmq STATIC IMPORTED) 
set_target_properties(zmq PROPERTIES IMPORTED_LOCATION ${zmq_location}) 

target_link_libraries(test zmq) 

これは、ライブラリを動的にリンクするを見えるような状況につながる可能性があり、しかしcmake source code has the answer

ターゲットは静的ライブラリでない場合は、リンク タイプが共有されていることを確認してください。これは、動的モードのリンクでは共有ライブラリと静的ライブラリの両方が を処理できますが、static-modeでは 静的ライブラリしか処理できないためです。以前のユーザーアイテムがリンクタイプを に変更した場合は、それが共有に戻っていることを確認する必要があります。

本質的に、ダイナミックモードの場合、ライブラリが静的であることを検出するリンカのハンドルを許可します。

+0

find_libraryによって返されたパスは間違いなく正しいです。私はあなたの更新されたcmakeファイルを使ってみました、そして、それは*両方の場所で動的であるようになっています。私もcmakeを最新バージョンにアップグレードしましたが、それでも問題は解決しません。 – morloch

1

/usr/local/lib/usr/libの違いについての私の最初の質問に対する答えは、デフォルトで/usr/local/libが暗黙のリンクディレクトリの1つではないということです。このother answerで指摘したように

set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES /usr/local/lib ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}) 

はしかし、直接ファイルを参照する代わりに、一つはadd_libraryを使用する必要があり、移動するための方法ではありません。したがって、クイックフィックスは、configに次の行を含めることです。

関連する問題