Clang в macOS не может связать lmenu с ncurses - PullRequest
0 голосов
/ 16 июня 2019

Я новичок в использовании библиотеки ncurses, поэтому я пытался воссоздать некоторые примеры на этой странице, http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/index.html.

Я получил раздел о создании меню, в частности, пример 21. Написанная мною программа работает на Linux, в частности на Ubuntu 18.04, но я не могу скомпилировать, когда использую библиотеку Menu. Все остальные примеры программ, которые я написал с использованием JUST, ncurses прекрасно компилируется без проблем, это просто когда я пытаюсь использовать библиотеку Menu.

Команда, которую я использую для сборки под Linux и macOS:

gcc libmenutest.c -o test -lmenu -lncurses

Я попытался переместить -lmenu -lncurses и изменить порядок в macOS, но безуспешно. Я установил ncurses через brew и попытался использовать gcc-8 из brew, но и там не получилось.

Я запускаю практически новую установку macOS и новейших инструментов командной строки. Я могу видеть libmenu в /usr/lib, так же, как libncurses. Так что я действительно растерялся, почему компилятор не нашел его.

Вот тестовый код, с которым я пытался диагностировать проблему.

#include <curses.h>
#include <menu.h>
#include <stdlib.h>

#define ARRAY_SIZE(a) (sizeof a / sizeof a[0])

int main (void)
{
  int i;
  int nchoices;

  char *choices[] = {
    "Choice 1", "Choice 2", "Choice 3", "Exit", (char *) NULL,
  };

  // Test that the types are present, this should test for the include headers
  ITEM **items;
  MENU *menu;
  WINDOW *win;

  // This will test for includes and to see if libncurses can be linked
  initscr ();
  noecho ();
  cbreak ();
  keypad (stdscr, TRUE);

  // this bit will test for libmenu include and if it can be linked
  nchoices = ARRAY_SIZE (choices);
  items = calloc (nchoices, sizeof (ITEM *));
  if (items == NULL) exit (1);
  for (i = 0; i < nchoices; i++)
    items[i] = new_item (choices[i], choices[i]);

  // write smarmy message to screen :^^^^^^)
  printw ("This worked :^)");
  refresh ();
  getch ();

  // clean up
  for (i = 0; i < nchoices; i++)
    free_item (items[i]);
  endwin ();

  return 0;
}

Вот вывод, который я сейчас получаю ...

Undefined symbols for architecture x86_64:
  "_free_item", referenced from:
      _main in libmenutest-0f0c39.o
  "_new_item", referenced from:
      _main in libmenutest-0f0c39.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

1 Ответ

1 голос
/ 17 июня 2019

Вы можете сделать следующее:

brew install ncurses

Поскольку macOS уже содержит версию ncurses, brew устанавливает свою альтернативную версию в /usr/local/opt/ncurses.

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

gcc -I/usr/local/opt/ncurses/include -L/usr/local/opt/ncurses/lib libmenutest.c -o test -lmenu -lncurses

Когда вы наконец вызываете свою программу, выводится следующее:

This worked :^) 

CMake

Для людей, использующих CMake, ваш CMakeLists.txt может выглядеть так:

cmake_minimum_required(VERSION 3.14)
project(libmenutest C)

set(CMAKE_C_STANDARD 99)

include_directories(/usr/local/opt/ncurses/include)

link_directories(/usr/local/opt/ncurses/lib)

add_executable(libmenutest libmenutest.c)

target_link_libraries(libmenutest menu ncurses)
...