2017-09-19 4 views
0

Bevor Sie als ein Duplikat markieren, habe ich 8 verschiedene Fragen ähnlich zu diesem auf Stackoverflow gelesen, und noch mehr so ​​an anderer Stelle. Ich würde dies nicht veröffentlichen, wenn eine dieser Antworten mein Problem lösen würde.CMake 3.9.1: Cmake nicht finden Bibliothek Ncurses

Ich verwendete diese genaue Vorlage mit den SDL2-Bibliotheken ohne ein Problem, die einzigen Änderungen, die ich machte, waren "SDL2" in "Curses" zusammen mit der set(CURSES_NEED_NCURSES TRUE) Linie zu ändern. (Und das scheitert immer noch ohne diese Zeile für irgendjemand wundern)

Ja ich habe es installiert, und ich kann es problemlos kompilieren mit gcc main.c -lncurses ohne Problem.

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

Jede Fehlermeldung? – arrowd

+1

Möglicherweise nicht mit dem Fehler verbunden, aber: 'set (CMAKE_BINARY_DIR ...)' - ** Setze nie die 'CMAKE_BINARY_DIR'-Variable. Viele externe und interne Skripts gehen davon aus, dass es auf das Binärverzeichnis der obersten Ebene verweist. 'set (CMake_ncurses-praxis_VERSION_MAJOR 1)' - "CMAKE" sollte hier in Großbuchstaben sein. Ansonsten hat Variable für CMake keine Bedeutung. – Tsyvarev

+0

Haben Sie FindCurses, cmake in Ihrem CMAKE_MODULE_PATH? –

Antwort

0

Sie haben einen Fehler im Code:

add_executable(a.out ${SRC_FILES}) 

target_link_libraries(ncurses-practice ${CURSES_LIBARIES}) 

target_link_libraries muss den Namen eines Ziels gegeben werden, nicht des Projekts. Also sollte die zweite Zeile target_link_libraries(a.out ${CURSES_LIBARIES}) stattdessen lesen (was ein schrecklicher Name für eine ausführbare Datei ist, BTW).

habe ich genau dieses Template mit den SDL2 Bibliotheken ohne ein Problem, die einzigen Änderungen, die ich wechseln „SDL2“ auf „Curses“

Leider ist das nicht, wie finden Skripte funktionieren gemacht. Zwar gibt es bestimmte Konventionen, nach denen CMake erwartet, dass ein korrektes Suchskript folgt, aber das sind eher lockere Richtlinien als strenge Regeln. Daher können Sie sich normalerweise nicht darauf verlassen, dass Code, der mit einem Suchskript funktioniert, auch mit einem anderen funktioniert.

Stattdessen müssen Sie immer die Dokumentation (und oft sogar die Quelle) des Skripts überprüfen, das Sie verwenden möchten, und den umgebenden Code sorgfältig darauf zuschneiden.

In Ihrem Fall ist die entsprechende Dokumentation die CMake doc for the FindCurses module, während die Quellen can be found on Kitware's gitlab.

Daraus sehen Sie, dass die Logik nicht sehr schlau ist. Stellen Sie sicher, dass die Pfade Ihrer lokalen Installation von Curses what the script expects entsprechen. Wenn Sie meinen, dass der Suchmechanismus des Skripts verbessert werden könnte, ziehen Sie in Erwägung, eine Pull-Anforderung mit einer verbesserten Version zu öffnen.

Stellen Sie außerdem sicher, dass die von Ihnen verwendeten Werte aus einem Find-Skript tatsächlich festgelegt wurden, bevor Sie sie in Ihrem CMake-Skript verwenden.

Bitte beachten Sie auch Tsyvarev's advice, nie die CMAKE_BINARY_DIR aus einem CMake-Skript setzen. Diese Variable soll von dem Benutzer festgelegt werden, der das Projekt erstellt und nicht das Projekt selbst. Das gleiche gilt für CMAKE_BUILD_TYPE.

0

find_package(Curses) erwartet FindCurses.cmake Datei in Ihrem CMAKE_MODULE_PATH vorhanden sein.

FindCurses.cmake sollte die Curses-Bibliothek finden und die benötigten Variablen setzen. Sie können andere Funktionen wie find_path, find_library in diesem FindCurses.cmake verwenden, um die Curses-Bibliothek zu finden. Eine andere Möglichkeit besteht darin, eine .pc-Datei zu schreiben und pkg_check_modules zu verwenden, um diese Curses-Bibliothek zu finden.

abgesehen davon, sind diese Linien 2

add_executable Buggy (a.$ Out {SRC_FILES})

target_link_libraries (ncurses-Praxis $ {CURSES_LIBARIES})

Hier add_executable ist ein Ziel namens a.out zu schaffen und Sie verknüpfen die CURSES_LIBRARIES für ein Ziel (ncurses-Praxis) das gibt es nicht.

So Ihre add_executable zu

ändern
add_executable(ncurses-practice ${SRC_FILES})