Тема: Як додати до gcc нову бібліотеку?
Маю встановлену бібліотеку ncurses, але gcc її не бачить, як я розумію.
Треба додати її через термінал, не знаю команди. ОС Manjaro.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Як додати до gcc нову бібліотеку?
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Маю встановлену бібліотеку ncurses, але gcc її не бачить, як я розумію.
Треба додати її через термінал, не знаю команди. ОС Manjaro.
Мабуть стоїть лише ncurses (.so для програм, що вже зібрані для використання з нею),
а потрібно щось в дусі ncurses-dev (хідери, .a з відсиланнями на .so)
Доповнено: в убунті це libncurses-dev (libncurses5-dev для libncurses5)
почитайте про аргументи
-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.
На команду gcc -lncurses видає ось таке:
Scrt1.o: у функції «_start»:
(.text+0x1b): невизначене посилання «main»
collect2: помилка: ld returned 1 exit status
Щодо libncurses-dev не бачив нічого такого, лише lib32, але вона вже встановлена.
так шо качали ? Чи конфігурували ?
де код ? екстрасенси в відпустці
так шо качали ? Чи конфігурували ?
де код ? екстрасенси в відпустці
Робив програму з підручника для С++, але там вона написана під <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;
}
#include <ncurses.h>
int main()
{
initscr();
printw("Hello world!\n");
refresh();
getch();
endwin();
return 0;
}
хоч HELLO WORLD компілює ?
#include <ncurses.h> int main() { initscr(); printw("Hello world!\n"); refresh(); getch(); endwin(); return 0; }
хоч HELLO WORLD компілює ?
Ні, ті самі помилки видає.
На команду 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 -- а отак!
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/
Проблеми були в Code Blocks, додав до Setting/Compiler setting/Global compiler setting/Linker setting шлях до файлу libncurses.so
і помилки при компіляції зникли. Але з'явилася інша проблема: після другого cin в main код не працює,
просто з'являється чорний екран терміналу з курсором без виконання наступного коду з cout.
помилки при компіляції зникли. Але з'явилася інша проблема: після другого cin в main код не працює,
просто з'являється чорний екран терміналу з курсором без виконання наступного коду з cout.
З лівого боку, трохи правіше ніж номери рядків є поле для точок зупинки (breakpoints). Постав одну (або кілька) і виконуй програму покроково.
Ймовірно ти не завершив вводити дані, може не жмакнув Enter, або попередній ввід завершився з помилками і треба їх очистити.
Vitaliy_Danmer написав:gcc її не бачить
Vitaliy_Danmer написав:Проблеми були в Code Blocks
Стоп, ще раз. То ти працюєш з gcc чи з Code Blocks ?
Якщо з gcc, то до чого тут Code Blocks ?
Якщо з Code Blocks, то чому початкове питання не містить його ?
Code Blocks — це IDE, яке працює з компілятором gcc.
Я думав проблема в gcc, тому не згадав Code Blocks.
Та це ви зіткнулися з прив'язкою самописних бібліотек до вікон.
Це щось на зразок написати щось з використанням OpenCV та змусити працювати в вікнах.
Тре або зібрати статичні бібліотеки та прописувати їх в системі, або робити динамічні бібліотеки та встановлювати їх в систему разом з аплікацією.
Нарешті розібрався. Замінив методи 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> туди. Не розумію.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися