1

Тема: Як додати до gcc нову бібліотеку?

Маю встановлену бібліотеку ncurses, але gcc її не бачить, як я розумію.
Треба додати її через термінал, не знаю команди. ОС Manjaro.

2 Востаннє редагувалося ReAl (20.07.2023 15:39:10)

Re: Як додати до gcc нову бібліотеку?

Мабуть стоїть лише ncurses (.so для програм, що вже зібрані для використання з нею),
а потрібно щось в дусі ncurses-dev (хідери, .a з відсиланнями на .so)

Доповнено: в убунті це libncurses-dev (libncurses5-dev для libncurses5)

Подякували: leofun011

3 Востаннє редагувалося reverse2500 (20.07.2023 15:39:58)

Re: Як додати до gcc нову бібліотеку?

почитайте про аргументи

-I, -L, -l, -i

https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gcc.pdf

-llibrary
-l library
Search the library named library when linking. (The second alternative with
the library as a separate argument is only for POSIX compliance and is not
recommended.)
The -l option is passed directly to the linker by GCC. Refer to your linker
documentation for exact details. The general description below applies to the
GNU linker.
The linker searches a standard list of directories for the library. The directories
searched include several standard system directories plus any that you specify
with -L.
Static libraries are archives of object files, and have file names like
liblibrary.a. Some targets also support shared libraries, which typically
have names like liblibrary.so. If both static and shared libraries are
found, the linker gives preference to linking with the shared library unless the
-static option is used.
It makes a difference where in the command you write this option; the linker
searches and processes libraries and object files in the order they are specified.
Thus, ‘foo.o -lz bar.o’ searches library ‘z’ after file foo.o but before bar.o.
If bar.o refers to functions in ‘z’, those functions may not be loaded.

Подякували: Teg Miles, leofun012

4

Re: Як додати до gcc нову бібліотеку?

На команду gcc -lncurses видає ось таке:

Scrt1.o: у функції «_start»:
(.text+0x1b): невизначене посилання «main»
collect2: помилка: ld returned 1 exit status

Щодо libncurses-dev не бачив нічого такого, лише lib32, але вона вже встановлена.

5

Re: Як додати до gcc нову бібліотеку?

так шо качали ? Чи конфігурували ?
де код ? екстрасенси в відпустці

6

Re: Як додати до gcc нову бібліотеку?

reverse2500 написав:

так шо качали ? Чи конфігурували ?
де код ? екстрасенси в відпустці

Робив програму з підручника для С++, але там вона написана під <conio.h>.
Замість conio використав ncurses, але видає помилки, на зразок: невизначене посилання «initscr».
Як я розумію, бо gcc не бачить ncurses.
Код:

#include <iostream>
#include <sstream>
#include <ncurses.h>

using namespace std;

int stringtonumber(string mystring)
{
    // Convert from string to number
    istringstream converter(mystring);
    // Contains the operation result
    int result;

    // Perform the conversion and return the result
    converter >> result;
    return result;
}

string enter_only_numbers()
{
    string num_as_string = ""; // Holds numeric string

    // init curses:
    initscr();

    char ch = getch(); // Obtains numeric string

    // Keep requesting characters until user presses Enter
    while (ch != '\r')
    {
        // \r is the Enter key
        // Add characters only they are numbers
        if (ch >= '0' && ch <= '9')
        {
            cout << ch;
            num_as_string += ch;
        }

        // Get the next character from an user
        ch = getch();
    }
    // end curses:
    endwin();
    return num_as_string;
}

string enter_password()
{
    // Holds the password string
    string num_as_string = "";

    // init curses:
    initscr();

    // Obtain single character from an user
    char ch = getch();

    // Keep requesting characters until user presses Enter
    while (ch != '\r')
    {
        cout << '*';
        num_as_string += ch;
        ch = getch();
    }
    // end curses:
    endwin();

    return num_as_string;
}

int main()
{

    string name;
    cout << "What are your name?" << endl;
    cin >> name;
    cout << "Hello " << name << endl;

    int x;
    cout << endl;
    cout << "Enter a number, any number!";
    cin >> x;
    cout << "You chose " << x << endl;

    cout << endl;
    cout << "This time enter only a number!" << endl;
    cout << "Enter a number, any number!";
    string entered = enter_only_numbers();
    int num = stringtonumber(entered);
    cout << endl << "You entered " << num << endl;

    cout << endl;
    cout << "Enter your password: ";
    string password = enter_password();
    cout << endl << "Shhhh, its " << password << endl;

    return 0;
}

7

Re: Як додати до gcc нову бібліотеку?

#include <ncurses.h>

int main()
{
    initscr();                   
    printw("Hello world!\n"); 
    refresh();                  
    getch();                     
    endwin();                    
    return 0;
}

хоч HELLO WORLD компілює ?

8

Re: Як додати до gcc нову бібліотеку?

reverse2500 написав:
#include <ncurses.h>

int main()
{
    initscr();                   
    printw("Hello world!\n"); 
    refresh();                  
    getch();                     
    endwin();                    
    return 0;
}

хоч HELLO WORLD компілює ?

Ні, ті самі помилки видає.

9

Re: Як додати до gcc нову бібліотеку?

Vitaliy_Danmer написав:

На команду gcc -lncurses видає ось таке:

Scrt1.o: у функції «_start»:
(.text+0x1b): невизначене посилання «main»
collect2: помилка: ld returned 1 exit status

Щодо libncurses-dev не бачив нічого такого, лише lib32, але вона вже встановлена.

Де саме стоїть -lncurses?

gcc -lncurses hello.c -- не так!

gcc hello.c  -lncurses -- а отак!

Подякували: Tarpan87, Teg Miles2

10

Re: Як додати до gcc нову бібліотеку?

ReAl написав:
Vitaliy_Danmer написав:

На команду gcc -lncurses видає ось таке:

Scrt1.o: у функції «_start»:
(.text+0x1b): невизначене посилання «main»
collect2: помилка: ld returned 1 exit status

Щодо libncurses-dev не бачив нічого такого, лише lib32, але вона вже встановлена.

Де саме стоїть -lncurses?

gcc -lncurses hello.c -- не так!

gcc hello.c  -lncurses -- а отак!

gcc hello.c  -lncurses виконалося без помилок у терміналі.
ncurses.h знаходиться в usr/include/

Подякували: Tarpan871

11

Re: Як додати до gcc нову бібліотеку?

Проблеми були в Code Blocks, додав до Setting/Compiler setting/Global compiler setting/Linker setting шлях до файлу libncurses.so
і помилки при компіляції зникли. Але з'явилася інша проблема: після другого cin в main код не працює,
просто з'являється чорний екран терміналу з курсором без виконання наступного коду з cout.

12 Востаннє редагувалося leofun01 (20.07.2023 22:42:12)

Re: Як додати до gcc нову бібліотеку?

ладно, проїхали ..
Vitaliy_Danmer написав:

gcc її не бачить

Vitaliy_Danmer написав:

Проблеми були в Code Blocks

Стоп, ще раз. То ти працюєш з gcc чи з Code Blocks ?
Якщо з gcc, то до чого тут Code Blocks ?
Якщо з Code Blocks, то чому початкове питання не містить його ?

Vitaliy_Danmer написав:

помилки при компіляції зникли. Але з'явилася інша проблема: після другого cin в main код не працює,
просто з'являється чорний екран терміналу з курсором без виконання наступного коду з cout.

З лівого боку, трохи правіше ніж номери рядків є поле для точок зупинки (breakpoints). Постав одну (або кілька) і виконуй програму покроково.
debug-with-code-blocks.png
Ймовірно ти не завершив вводити дані, може не жмакнув Enter, або попередній ввід завершився з помилками і треба їх очистити.

13

Re: Як додати до gcc нову бібліотеку?

leofun01 написав:
Vitaliy_Danmer написав:

gcc її не бачить

Vitaliy_Danmer написав:

Проблеми були в Code Blocks

Стоп, ще раз. То ти працюєш з gcc чи з Code Blocks ?
Якщо з gcc, то до чого тут Code Blocks ?
Якщо з Code Blocks, то чому початкове питання не містить його ?

Code Blocks  — це IDE, яке працює з компілятором gcc.
Я думав проблема в gcc,  тому не згадав Code Blocks.

14 Востаннє редагувалося Droid 77 (20.07.2023 23:37:05)

Re: Як додати до gcc нову бібліотеку?

Та це ви зіткнулися з прив'язкою самописних бібліотек до вікон.
Це щось на зразок написати щось з використанням OpenCV та змусити працювати в вікнах.
Тре або зібрати статичні бібліотеки та прописувати їх в системі, або робити динамічні бібліотеки та встановлювати їх в систему разом з аплікацією.

15

Re: Як додати до gcc нову бібліотеку?

Нарешті розібрався. Замінив методи ncurses на стандартні від iostream.
Усе працює, окрім зірочок, що мають маскувати пароль при вводі.

#include <iostream>
#include <sstream>
#include <limits>

using namespace std;

int stringtonumber(string mystring)
{
    // Convert from string to number
    istringstream converter(mystring);
    // Contains the operation result
    int result;

    // Perform the conversion and return the result
    converter >> result;
    return result;
}

string enter_only_numbers()
{
    string num_as_string = ""; // Holds numeric string
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    char ch = cin.get();// Obtains numeric string

    // Keep requesting characters until user presses Enter
    while (ch != '\n')
    {

        // \r is the Enter key
        // Add characters only they are numbers
        if (ch >= '0' && ch <= '9')
        {
            num_as_string += ch;
        }

        // Get the next character from an user
        ch = cin.get();
    }
    return num_as_string;
}

string enter_password()
{
    // Holds the password string
    string num_as_string = "";

    // Obtain single character from an user
    char ch = cin.get();

    // Keep requesting characters until user presses Enter
    while (ch != '\n')
    {
        cout << '*';
        num_as_string += ch;
        ch = cin.get();

    }

    return num_as_string;
}

int main()
{

    string name;
    cout << "What are your name?" << endl;
    cin >> name;
    cout << "Hello " << name << endl;

    int x;
    cout << endl;
    cout << "Enter a number, any number! ";
    cin >> x;
    cout << "You chose " << x << endl;

    cout << endl;
    cout << "This time enter only a number!" << endl;
    cout << "Enter a number, any number!" << endl;

    string entered = enter_only_numbers();
    int num = stringtonumber(entered);
    cout << endl << "You entered " << num << endl;

    cout << endl;
    cout << "Enter your password: ";
    string password = enter_password();
    cout << endl << "Shhhh, its " << password << endl;

    return 0;
}

P.S. Бійтеся старих програмістів, що полюбляють використовувати бібліотеки типу <СловоОполкуІгорєвєСамвидавВиданняТретєДоповнене.h>;)
Писати підручник у 2020 році й взяти вліпити <conio.h> туди. Не розумію.