Вопрос по undefined-reference, pdcurses, cmake, c, windows – Как связать curses.h в Cmake?

3

Я знаю, что, возможно, это глупый вопрос, но я не могу его разглядеть, я искал здесь другие ответы, довольно близкие к моим, но, тем не менее, я не понимал, как это сделать.

Проблема в том, что я не могу скомпилировать программу «C», которая использует curses.h в Windows (я использую Clion с MinGW), когда я пытаюсь это сделать, она дает «неопределенную ссылку» для функций в curses.h (Например, «initscr», «clear», ...).

Через MinGW Installation Manager я установил «mingw-32-libpdcurses» (было два доступных с двумя разными классами: dev и dll; я установил один dll).

Файл CMAKE, который я использую, таков:

cmake_minimum_required(VERSION 3.3)
project(Project1)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -lpdcurses")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

file(GLOB Project1_SRC
        "*.h"
        "*.c"
        )

add_executable(Project1 ${Project1_SRC})

Что я должен изменить в нем, чтобы он компилировался с curses.h?

Я думаю, что вы должны добавить библиотеку вCMAKE_EXE_LINKER_FLAGS. kfx
Хм ... вы установили dll, а не пакет dev? Я не знаю много о MinGW, но обычно вынеобходимость пакет dev для получения заголовочных файлов. Любопытно, что вы получилилинкер ошибка, а не ошибка компилятора об отсутствующем заголовке. Убедитесь, что вы не используете заголовок из другой версии библиотеки или даже из другого дистрибутива curses. Этосвязанный терпеть неудачу. DevSolar

Ваш Ответ

1   ответ
5

В основном так же, как вы находите и интегрируетелюбой сторонняя библиотека с CMake: использование одного изFind___.cmake модули.

Они расположены вshare/cmake-X.Y/Modules вашего установочного каталога CMake. Проверьте сами файлы на предмет их индивидуальной документации иcmake --help-command find_package для деталей о том, как позвонить им.

Я не пробовал следующее с PDCurses специально для MinGW, но если это не сработало, это явное сообщение об ошибке для Kitware (создателей CMake):

find_package( Curses REQUIRED )
include_directories( ${CURSES_INCLUDE_DIRS} )
target_link_libraries( Project1 ${CURSES_LIBRARIES} )

Следующие переменные устанавливаются соответствующим образом, чтобы сообщить вам, какой заголовок доступен:

  • CURSES_HAVE_CURSES_H заcurses.h
  • CURSES_HAVE_NCURSES_H заncurses.h
  • CURSES_HAVE_NCURSES_NCURSES_H заncurses/ncurses.h
  • CURSES_HAVE_NCURSES_CURSES_H заncurses/curses.h

Дополнительный совет:

file(GLOB Project1_SRC
        "*.h"
        "*.c"
        )

Не делай этого.

Чтобы процитировать из документации этой самой функции:

Мы не рекомендуем использовать GLOB для сбора списка исходных файлов из вашего исходного дерева. Если файл CMakeLists.txt не изменяется при добавлении или удалении источника, сгенерированная система сборки не может знать, когда попросить CMake сгенерировать заново.


set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

Не делай этого тоже.

Ты не хочешьлюбой сгенерированные файлы, чтобы в конечном итогеисточник каталог (где они мешают вашей системе управления версиями, или, что еще хуже, фактически регистрируются в хранилище). Вы хотите создать все вдвоичный каталог, чисто из пути.

(ctd) ... ты должен возиться с CMake, Curses,а также MinGW на данный момент, вместо того, чтобы немного больше познакомиться с одним за раз? DevSolar
Большое спасибо за вашу помощь и терпение, я изменил переменную% PATH%, и теперь она работает. Да, я, вероятно, не должен связываться со многими вещами одновременно, но я должен это делать в университетских целях. Проблема в том, что я начал использовать CLion (который использует CMake) менее чем за месяц, а до этого я никогда не использовал CMake и не связывался с minGW, я использовал Code-Blocks (которые не используют CMake), и с этим было проще собирать и компилировать, но, однажды посмотрев на CLion, я влюбился, это потрясающая IDE. Еще раз спасибо за вашу помощь! Aster
Я изменил файл CMake какэтот (Сейчас я оставлю «GLOB» и сгенерированный файл в исходном коде, пока я не разрешу все с помощью PDcurses), теперь он компилируется, но когда я пытаюсь выполнить программу, он говорит, что у меня нет «libncursesw-6. DLL "в моем компьютере. Если я пытаюсь выполнить одну из демонстраций PDcurses, она говорит, что мне не хватает «libpdcurses.dll». Я не знаю что не так. Я думаю, что я правильно установил библиотеку, как вы можете видетьВот Aster
@Aster: это означает, что библиотека находится вкомпилировать время (потому что CMake всегда предоставляет полный путь к файлу для любой библиотеки), но не вбежать время (потому что информация о пути теряется в двоичном виде). Вы можете либо: а) расширить путь поиска в библиотеке (это означало бы расширение% PATH% для Windows, либо отредактировать /etc/ld.so.conf или, соответственно, добавить в /etc/ld.so.conf.d в Linux), либо б) заставить CMake скомпилировать полный путь к библиотеке в исполняемый файл (set( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE )). Но мы говорим здесь довольно об основных проблемах с инструментарием; ты уверен ... (t.b.c.) DevSolar

Похожие вопросы