7

[CMake ヘルプ リストから恥知らずにクロスポスト]

できるだけ静的にバイナリを作成しようとしています。私が持っている fortran コードには依存関係として X11 と quadmath があり、いくつかの問題に遭遇しました (これらの問題はそれぞれ別の質問にすべきでしょうか?):

  • 私の変数は現在

    set(CMAKE_LIBRARY_PATH /usr/X11/lib /usr/X11/include/X11 ${CMAKE_LIBRARY_PATH})
    find_package(X11 REQUIRED)
    find_library(X11 NAMES X11.a PATHS /usr/X11/include/X11/ /usr/X11/lib)
    find_library(X11_Xaw_LIB NAMES Xaw Xaw /usr/X11/include/X11/ /usr/X11/lib ${X11_LIB_SEARCH_PATH})
    find_library(Xaw Xaw7 PATHS ${X11_LIB_SEARCH_PATH})
    
    set(CMAKE_LIBRARY_PATH /usr/lib/gcc/x86_64-linux-gnu/4.7 /usr/lib/gcc/x86_64-linux-gnu/4.7/x32 /usr/lib/gcc/x86_64-linux-gnu/4.7/32 ${CMAKE_LIBRARY_PATH})
    
    find_library(quadmath NAMES quadmath.a)
    
    set(BUILD_SHARED_LIBS ON)
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
    set(LINK_SEARCH_START_STATIC TRUE)
    set(LINK_SEARCH_END_STATIC TRUE)
    
    set(SHARED_LIBS OFF)
    set(STATIC_LIBS ON)
    
    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
    
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
    

これらを使用して、CMake はすべてのプログラムを (予想どおり) 静的にビルドしようとしますが、持っていないため失敗しますXaw.a。これが実際に存在するかどうかはわかりません。libxaw7-dev私はそれを修正することを期待していた最新のものをインストールしました。1 つのオプションは、X11 ライブラリを自分でコンパイルすることですが、実際にはそうしたくありません...

  • のみをコメントアウトすると、呼び出しで X11 ライブラリの場所を指定してもset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")、CMake はすべてをコンパイルします、すべてのプログラムで共有ライブラリを使用します。私は CMake が .a ファイルを使用し、共有ライブラリのみを使用することを期待していました - この動作を強制する方法はありますか?.afind_library()

  • ここで説明されているバグの修正をまだ知っている人はいますか: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46539 ; gfortranはlibquadmathを静的にリンクできないようですか? gcc を使用して修正を試みましたが、CMake に libgfortran フラグを認識させることができません。

    cmake -DCMAKE_Fortran_COMPILER=gcc -DCMAKE_Fortran_FLAGS=-gfortran
    

結果は

-- The Fortran compiler identification is unknown
-- Check for working Fortran compiler: /usr/bin/gcc
-- Check for working Fortran compiler: /usr/bin/gcc  -- broken
CMake Error at /usr/share/cmake-2.8/Modules/CMakeTestFortranCompiler.cmake:54 (message):
The Fortran compiler "/usr/bin/gcc" is not able to compile a simple test program.

ただし、お気づきかもしれませんが、libquadmath.a の場所を設定しました。X11 を使用しないが、quadmath を使用するプログラムを作成する場合

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")

その後、プログラムは正常にコンパイルされます (ldd レポートを実行すると「動的実行可能ファイルではありません」)。これは、バグが修正されたことを意味しますか、それとも CMake で場所を設定したためにのみ機能しますか?

4

2 に答える 2

0

あなたの質問はそれほど関連していないと思います。すべての質問に対する答えはわかりません。

静的リンクの問題については、GCC を使用しているため、複数の -static および -dynamic フラグを渡すことができます。

set(CMAKE_EXE_LINKER_FLAGS "-static ${STATIC_LIBS} -dynamic ${EVERYTHING ELSE} -static ${MORE_STATIC_LIBS}")

あなたのシステムで が利用できない理由はわかりませんXaw.a。おそらく、あなたの Linux ディストリビューションのパッケージ メンテナーがそれらを利用できるようにしていないからでしょう。

また、すべてを静的にコンパイルすると、そこにあるすべてのディストリビューション間で互換性がなくなる可能性があり、他の人がプログラムで改善された最新のライブラリを使用する機能が損なわれる可能性があります。それはあなたが望むものではないかもしれません.

プログラムの自己完結型パッケージを作成する場合は、Dropbox や他の多くのプロプライエタリ アプリケーションのように、一緒に使用した共有ライブラリを含めるだけの方がよい場合があります (Humble Bundle ゲームは別の例です)。

于 2014-04-22T19:59:00.407 に答える