2017-09-19 10 views
0

重複としてマークする前に、私はStackoverflowでこのような8つの質問を読んだことがあります。これらの回答のいずれかが私の問題を解決した場合、私はこれを投稿しません。CMake 3.9.1:ライブラリncursesを見つけることができません

この正確なテンプレートをSDL2ライブラリで問題なく使用しましたが、唯一の変更は "SDL2"を "Curses"に変更してset(CURSES_NEED_NCURSES TRUE)行としたことです。 (これはまだ疑問のある人のための行なしで失敗する)

はいそれはインストールされており、私は簡単にgcc main.c -lncursesでコンパイルできます。

cmake_minimum_required (VERSION 2.6) 
project (ncurses-practice) 

# Version info 
set(CMake_ncurses-practice_VERSION_MAJOR 1) 
set(CMake_ncurses-practice_VERSION_MINOR 0) 

# Common Variables 
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin) 
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) 
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) 
set(SRC ${CMAKE_SOURCE_DIR}/src) 
set(HDRS ${CMAKE_SOURCE_DIR}/headers) 
set(CMAKE_C_FLAGS " -Wall") 

# Set Ncurses 
set(CURSES_NEED_NCURSES TRUE) 
find_package(Curses) 


# Debug 
set(CMAKE_BUILD_TYPE Debug) 

# Source Files 
set(SRC_FILES 
    ${SRC}/main.c 
) 

# Included directories 
include_directories("src" "headers" ${CURSES_INCLUDE_DIRS}) 

# Generate Executable 
add_executable(a.out ${SRC_FILES}) 

# Add libraries here after the project name 
target_link_libraries(ncurses-practice ${CURSES_LIBARIES}) 
+1

すべてのエラーメッセージに変更できますか? – arrowd

+1

おそらくエラーとは無関係ですが、 'set(CMAKE_BINARY_DIR ...)' - **決して 'CMAKE_BINARY_DIR'変数を設定しないでください。多くの外部および内部のスクリプトは、それがトップレベルのバイナリディレクトリを指していると想定しています。 'set(CMake_ncurses-practice_VERSION_MAJOR 1)' - "CMAKE"はここでは大文字でなければなりません。さもなければ変数はCMakeに意味を持たない。 – Tsyvarev

+0

あなたのCMAKE_MODULE_PATHに、FindCurses、cmakeがありますか? –

答えて

0

あなたはあなたのコードにバグがあります。

add_executable(a.out ${SRC_FILES}) 

target_link_libraries(ncurses-practice ${CURSES_LIBARIES}) 

ターゲットのではなく、プロジェクトの名前を与える必要があるtarget_link_librariesを。だから、2行目はtarget_link_libraries(a.out ${CURSES_LIBARIES})(代わりに実行ファイルの恐ろしい名前、btw)を読んでください。

私は

私が作った のみの変更は「呪い」に「SDL2」を変更して、問題なくSDL2ライブラリとこの正確なテンプレートを使用残念ながら、それはスクリプトが動作を見つける方法はありません。 CMakeは、適切に動作する検索スクリプトが続くと予想している特定の規則がありますが、厳密な規則よりも緩いガイドラインです。したがって、ある検索スクリプトで動作し、別の検索スクリプトでも動作するコードには、通常は頼ることができません。

代わりに、使用するスクリプトのドキュメント(およびしばしばソース)をチェックし、周囲のコードを慎重に調整する必要があります。

関連資料はCMake doc for the FindCurses moduleで、ソースはcan be found on Kitware's gitlabです。

これからロジックがあまりスマートではないことがわかります。ローカルインストールのcursesのパスがwhat the script expectsに対応していることを確認してください。スクリプトの検索メカニズムが改善されると思われる場合は、改善されたバージョンでプルリクエストを開くことを検討してください。

また、検索スクリプトから使用する値が実際にCMakeスクリプトで使用される前に設定されているかどうかを確認してください。

また、Tsyvarev's adviceは、CMakeスクリプト内からCMAKE_BINARY_DIRを絶対に設定しないようにしてください。この変数は、プロジェクト自体ではなく、プロジェクトを構築しているユーザーによって設定されているものとします。 CMAKE_BUILD_TYPEについても同様です。

0

find_package(Curses)FindCurses.cmakeファイルがCMAKE_MODULE_PATHに存在することが予想されます。

FindCurses.cmakeはcursesライブラリを見つけ、必要な変数を設定する必要があります。このFindCurses.cmake内のfind_path、find_libraryなどの他の関数を使用して、cursesライブラリを見つけることができます。他の方法は、.pcファイルを作成し、このCursesライブラリを見つけるためにpkg_check_modulesを使用することです。

は、それとは別に、これらの2行は

add_executable(バギーです。アウト$ {SRC_FILES})

target_link_libraries(ncursesのプラクティス$ {CURSES_LIBARIES})

ここadd_executableがターゲットと呼ばれるのa.outを作成しているし、あなたがターゲットのCURSES_LIBRARIESをリンクされている(ncursesのプラクティス)それは存在しません。

だからあなたadd_executableは

add_executable(ncurses-practice ${SRC_FILES}) 
関連する問題