1

この行を使用して、単純なプログラムをコンパイルします。

g++ main.cc -lntl -lm -lgmp 

これをどのように CMake に含めますか?

find_package(NTL REQUIRED)
find_package(GMP REQUIRED)

うまくいきません。次のエラーが表示されます。

CMake Error at CMakeLists.txt:30 (find_package):
  Could not find module FindNTL.cmake or a configuration file for package
  NTL.
...
.

SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++0x -lntl -lm -lgmp)

どちらも機能しません(ただし、一般的には間違っていると思います)。

ありがとうございました!

4

2 に答える 2

4

、、、およびライブラリが通常ntl、デフォルトパスのどこかにインストールされている場合(または)、次のように簡単に実行できます。mgmp/usr//usr/local/

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(Test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
add_executable(test main.cc)
target_link_libraries(test ntl m gmp)


これはおそらく元のg++コマンドに最も近いものですが、それほど堅牢ではありません。ライブラリが見つからない場合は、リンクを試みるまでそのライブラリについて知ることはできません。構成時に(つまり、CMakeの実行中に)失敗したい場合find_libraryは、必要な各ライブラリの呼び出しを追加できます。

find_library(NTL_LIB ntl)
if(NOT NTL_LIB)
  message(FATAL_ERROR "ntl library not found.  Rerun cmake with -DCMAKE_PREFIX_PATH=\"<path to lib1>;<path to lib2>\"")
endif()

target_link_libraries次に、コマンドを次のように変更する必要があります。

target_link_libraries(test ${NTL_LIB} ${M_LIB} ${GMP_LIB})

次にfind_file、コマンドを介して追加する適切なパスを見つけるために、各libのヘッダーファイルの1つに対しても実行する必要があります(これはg ++include_directoriesに変換されます)。-I


余分なCXX_FLAGS引数を引用符で囲むことが重要です。そうしないと、CMakeはそれらをリスト内の個別の値のように扱い、フラグの間にセミコロンを挿入します。


、などの詳細についてfind_libraryは、以下find_fileを実行してください。

cmake --help-command find_library
cmake --help-command find_file
于 2012-05-08T00:52:31.817 に答える
3

あなたのエラーについて:

FindNTL.cmakeCMake に含まれるモジュールがあるようには見えません。つまり、次のいずれかを行う必要があります。

  • 自分で書いてFindNTL.cmake
  • 他の誰かが書いた別のものを見つけて、
  • 次のようなソリューションをハックします。
    • NTL がインストールされているかどうかを確認します
    • リンク ターゲット、関連するフラグなどを提供します。

(かなり迅速な)Google検索から、誰かがCMake 用の NTL モジュールを持っているようです。NTL は GMP を使用するため、おそらくCMake に関連する GMP モジュールが必要になります。これは完全な機能を備えた CMake モジュールのようには見えませんが、最高のもののようにも見えます (繰り返しますが、これは Google で簡単に検索したものであり、私は NTL を使用していません)。

使用するには、にいくつかのものを追加する必要がありますCMakeLists.txt:

# Let CMake know where you've put the FindNTL.cmake module. 
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/CMake/Modules")
# Call the FindNTL module:
find_package(NTL REQUIRED)

SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++0x -lntl -lm -lgmp)

はい、これは間違っています。CXX_FLAGSwith linkingディレクティブを設定したくありません。私は使うだろう:

SET ( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=cxx0x )

使用する Cxx 標準を設定します。実際にライブラリにリンクするには、次のようにする必要があります。

  • ライブラリが見つかったことを確認します(関連するfind_package ( FOO )行を含む)
  • 次のように、それらをターゲットにリンクします。

    # Build the Foo executable. (Or library, or whatever)
    add_executable (FooEXE ${Foo_SOURCES} )
    target_link_libraries (FooEXE
        ${bar_LIBRARIES}
        ${baz_LIBRARY}
        )
    

    ご注意ください!タイプミスではありません${bar_LIBRARIES}${baz_LIBRARY}モジュールに関連するライブラリを設定する標準的な方法はありませんFindFOO.cmake。私の意見では、これは厄介なことです。1 つが機能しない場合は、もう 1 つを試すか、最悪の場合は、関連するFindFOO.cmakeファイル (デフォルトで CMake と共にインストールされているものがたくさんあります) を調べて、それぞれが何を使用しているかを確認してください。私が提供したリンクでは、${NTL_LIB} と ${GMP_LIB} を使用できます。

于 2012-05-07T23:56:01.460 に答える