Включить внешнюю библиотеку в C
Я пытаюсь использовать библиотеку C для курса opencourseware из Гарварда. Инструкции инструктора по настройке внешней библиотеки можно найти здесь.
Я следую инструкциям, относящимся к Ubuntu, так как я пытаюсь использовать эту библиотеку на моем Ubuntu Box. Я следовал инструкциям на странице, чтобы настроить его, но когда я запускаю простой helloWorld.c
программа, использующая библиотечную функцию cs50, gcc не хочет подыгрывать.
Пример:
helloworld.c
#include <stdio.h>
#include <cs50.h>
int
main(void){
printf("What do you want to say to the world?\n");
string message = GetString();
printf("%s!\n\n", message);
}
$ gcc helloWorld.c
/tmp/ccYilBgA.o: In function `main':
helloWorld.c:(.text+0x16): undefined reference to `GetString'
collect2: ld returned 1 exit status
Я следовал инструкциям к письму, как указано в инструкции, но они не работали для меня. Я бегу Ubuntu 12.04. Пожалуйста, дайте мне знать, если я смогу прояснить мою проблему.
6 ответов
Во-первых, как новичок, вы всегда должны просить GCC компилировать со всеми включенными предупреждениями и информацией отладки, т.е. gcc -Wall -g
Тогда вы, вероятно, упускаете какую-то специфическую для Гарварда библиотеку, например -L
затем следует каталог библиотеки, затем -l
приклеен к названию библиотеки. Так что вам может понадобиться gcc -Wall -g -lcs50
(заменить cs50
под соответствующим именем), и вам может понадобиться -L
некоторые-Dir
Обратите внимание, что порядок аргументов программы gcc
является значительным. Как правило, если a
зависит от b
ты должен положить a
до b
; более конкретно я предлагаю
- Начните с
gcc
название программы; добавить стандартный уровень C, например-std=c99
если хотел - Поместите предупреждение компилятора, параметры отладки (или оптимизации), например
-Wall -g
(вы можете даже добавить-Wextra
чтобы получить еще больше предупреждений). - Поместите определения препроцессора и включите каталог, например
-DONE=1
а также-Imy-include-dir/
- Поместите ваш исходный файл C
hello.c
- Поместите любые объектные файлы, с которыми вы ссылаетесь, т.е.
bar.o
- Положите каталоги библиотеки
-Lmy-lib-dir/
если актуально - Pur имена библиотек
-laa
а также-lbb
(когдаlibaa.so
зависит отlibbb.so
, в этой последовательности) - Конец с
-o your-program-name
дать название произведенного двоичного файла. Не используйте имя по умолчаниюa.out
Варианты предоставления каталогов -I
(для препроцессора входит) и -L
для библиотек можно указывать несколько раз, порядок значим (порядок поиска).
Очень быстро вы захотите использовать такие инструменты, как make
Научитесь также использовать отладчик gdb
Получите привычку всегда запрашивать предупреждения у компилятора и всегда улучшайте свою программу, пока не получите никаких предупреждений: компилятор - ваш друг, он помогает вам!
Повеселись.
Я беру этот курс, и иногда мне нужно практиковаться в автономном режиме во время поездок или поездок на работу. Под Windows, используя MinGW и Notepad++ в качестве IDE (потому что я люблю его и использую его обычно при кодировании python), я наконец нашел решение и некоторое время записал его.
Начиная с нуля. Шаги по настройке компилятора gcc C, если он уже установлен, перейдите к 5
- Скачайте Git и установите. Он включает в себя Git Bash, который является терминалом MINGW64 для Linux. Я предпочитаю использовать Git, так как мне нужны инструменты Linux, такие как sed, awk, pull, push на моей Windows, и они могут заменить терминал Guthub.
- После установки Git убедитесь, что установлены пакеты gcc. Вы можете использовать мою конфигурацию для справки...
Убедитесь, что ваш компилятор работает. Брось этот простой код,
- сохранив его в своем рабочем каталоге Documents/Harvard_CS50/Week2/ hello.c
#include <stdio.h> int main(void) { printf("Hello Stackru\n"); }
- запустить Git Bash -> перейти в рабочий каталог
CD Documents/Harvard_CS50/Week2/
- скомпилируйте его в терминале bash
gcc helloworld.c -o helloworld.exe
- выполнить его с помощью терминала bash
./helloworld.exe
Привет Stackru
- Если вы видите Hello Stackru, ваш компилятор работает, и вы можете написать C-код.
Теперь о важном: установка библиотеки CS50 локально и использование ее в автономном режиме. Это должно быть применимо для любых других библиотек, представленных позже в курсе.
Загрузите последний файл исходного кода cs50.c и заголовочный файл cs50.h с https://github.com/cs50/libcs50/tree/develop/src и сохраните их в Documents/Harvard_CS50/src
Перейдите в каталог src и перечислите файлы, чтобы убедиться, что вы находитесь в нужном месте, используя
Ls
cs50.c cs50.h
Круто, мы здесь. Теперь нам нужно скомпилировать объектный файл для библиотеки, используя
gcc -c -ggdb -std=c99 cs50.c -o cs50.o
Теперь, используя сгенерированный объектный файл cs50.o, мы можем создать наш архивный файл библиотеки cs50.
ar rcs libcs50.a cs50.o
После всех этих шагов мы закончили с 2 дополнительными файлами к нашим оригинальным файлам. Нас интересуют только 2 из них cs50.h libcs50.a
Ls
cs50.c cs50.h cs50.o libcs50.a
Скопируйте библиотеку и заголовочные файлы в их целевые местоположения. Мой MinGW установлен в C:\, поэтому я копирую их туда
cs50.h -> C:\ MinGW \ include
libcs50.a -> C:\MinGW\lib
Тестирование библиотеки CS50
Чтобы убедиться, что наша библиотека работает, мы можем бросить один из примеров сценариев в лекции и посмотреть, сможем ли мы скомпилировать ее, используя заголовочный файл cs50.h для метода get_string().
#include <stdio.h>
#include <cs50.h>
int main(void)
{
printf("Please input a string to count how long it is: ");
string s = get_string();
int n = 0;
while (s[n] != '\0')
{
n++;
}
printf("Your string is %i chars long\n", n);
}
Скомпилируйте код cs50, используя библиотеки gcc и cs50. Я хочу быть явным и использовать:
gcc -ggdb -std = c99 -Wall -Werror test.c -lcs50 -o test.exe
Но вы можете просто указать источник, имя выходного файла и библиотеку cs50
gcc test.c -o test.exe -lcs50
Здесь мы идем, программа компилируется с использованием заголовка и методы могут быть использованы внутри.
Если вы хотите, чтобы Notepad++ был интегрированной средой разработки, вы можете следовать этому совету, чтобы настроить его с gcc в качестве компилятора и запустить ваш код оттуда. Просто убедитесь, что ваш скрипт nppexec содержит библиотеку cs50
npp_save
gcc -ggdb -std=c99 -Wall -Werror "$(FULL_CURRENT_PATH)" -lcs50 -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe"
cmd /c "$(CURRENT_DIRECTORY)\$(NAME_PART).exe"
- Загрузите cs50 по адресу: http://mirror.cs50.net/library50/c/library50-c-5.zip
- Извлеките это. (Вы получите два файла cs50.c и cs50.h)
- Теперь скопируйте оба файла в папку библиотеки по умолчанию. (который включает в себя ваш файл stdio.h)
- Теперь при написании вашей программы используйте: #include
- Вы также можете скопировать файлы в папку, содержащую файл helloWorld.c.
- Вы должны использовать: #include " cs50.c ".
ИЛИ ===========================================================================>
- Откройте файлы cs50.c и cs50.h в текстовом редакторе.
- В cs50.h, чуть ниже #include
добавьте #include и #include в новой строке. - Теперь откройте файл cs50.c, скопируйте все (из: /** Считывает строку текста из стандартного ввода и возвращает эквивалент {от строки 47 до последней}) и вставьте его в cs50.h чуть выше #endif и сохраните файлы.
- Теперь вы можете скопировать файл cs50.h либо в вашу папку библиотеки по умолчанию, либо в вашу текущую рабочую папку.
- Если вы скопировали файл в папку по умолчанию, используйте: #include
, а если вы скопировали файлы в текущую рабочую папку, используйте: #include " cs50.h ".
Если вам нужна помощь, вы можете обратиться ко мне по адресу faizan4427@gmail.com, и если это сработало, пожалуйста, проголосуйте.
Всего наилучшего!!!
Вам нужно сделать ссылку на библиотеку во время компиляции. Библиотека должна заканчиваться на.a или.so, если вы используете Ubuntu. Чтобы создать ссылку на библиотеку:
gcc -o myProgram myProgram.c -l(library name goes here but no parentheses)
Вы должны сделать ссылку на библиотеку, почему GCC узнает, какую библиотеку вы хотите использовать?
gcc helloWorld.c -lcs50
Источники исследований:
- опираясь на приведенные выше ответы Базиля Старинкевича и Гюнай Анах
- в сочетании с инструкциями из некоторых видео на YouTube 1 2
Подход:
- охватывающий минимум дел и разделяющий «нормы» отдельно
- избегая каких-либо изменений в любом другом месте системы
- включая базовую разбивку используемых команд
- не включая все мелкие детали, охватывая только требования, абсолютные для задачи или для эффективной передачи инструкций. оставив другие мирские детали читателю
- предполагая, что другие вещи, такие как компилятор, переменная среды и т. д., уже настроены, и знакомы с командами навигации по файлам оболочки.
Моя среда:
- компилятор:
gcc
через msys2 - оболочка:
bash
через msys2 - IDE: здесь не имеет значения
План:
- получение исходных файлов
- создание необходимых файлов:
*.o
(объект) и (архив) - говорит компилятору использовать его
Действие:
Скажем, текущий каталог = "desktop/cs50"
. Он содержит все файлы, такие как test-file.c, которые я буду создавать для заданий/наборов задач/тренировок и т. д.Получить и
*.c
файлы
Источник в этом конкретном случае: https://github.com/cs50/libcs50/tree/main/src- Просмотрите каждый файл в отдельности
- Скопируйте все его содержимое.
Скажите, используя значок «Копировать необработанное содержимое» отдельных файлов. - Создайте соответствующий файл локально на компьютере.
Сделайте это в отдельной папке, чтобы все было чисто, скажем, в «desktop/cs50/src», также известном как «desktop/cs50/src»../src
Создайте необходимые файлы, используя терминал после изменения текущего каталога на «desktop/cs50/src»:
-
gcc -c cs50.c
для создания объектного файла "cs50.o" из "cs50.c" с помощью "gcc" -
ar cr libcs50.a cs50.o
создать архивный файл "libcs50.a", который будет содержать объектный файл "cs50.o"
- Здесь «libcs50» = префикс «lib» + имя «cs50» (то же, что и имя заголовочного файла)
- Это нормальный/стандартный способ, когда префикс «lib» также важен для более позднего шага.
- Однако префикс можно пропустить, и имя также не обязательно должно совпадать с именем заголовочного файла. Тем не менее, пропускать префикс не рекомендуется. И я не могу точно сказать о части имени
-
Чтобы компилятор мог использовать эту инфраструктуру, команды будут иметь следующий синтаксис после перехода в родительский каталог (т.е. в «desktop/cs50»):
-
gcc test-file.c -Isrc -Lsrc -lcs50
если вы использовали префикс «lib» на шаге 2.2 выше - здесь,
-I
флаг для указания каталога*.h
заголовочный файл, включенный в ваш test_file.c - а также
-L
флаг предназначен для указания каталога, который будет использоваться для - а также
-l
для имени*.a
файл. Здесь префикс «lib», о котором говорилось ранее, и не упоминается расширение «.a». - порядок этих флагов имеет значение, сохраняйте
-I -L -l
флаги после "test-file.c"
-
Еще несколько примечаний:
- не забудьте использовать дополнительные общие флаги (например, предложенные выше для ошибок и т. д.)
- если вы пропустили префикс "lib", то вы не можете использовать
-L -l
флаги
, поэтому синтаксис для команды станет:gcc test-file.c -Isrc src/libcs50.a
- скажем, я создал свой
test-file.c
файл в "desktop/cs50/psets", поэтому его можно обрабатывать двумя известными способами (текущий каталог = "desktop/cs50/"):-
cd psets
затем изменив относительный адрес соответственно в-I -L
, поэтому результат:
gcc test-file.c -I../src -L../src -lcs50
- сохраняя текущий каталог таким же, но затем соответствующим образом изменяя относительный адрес файла, поэтому результат:
gcc psests/test-file.c -Isrc -Lsrc -lcs50
- или используйте абсолютные адреса
-
- как видно, это становится довольно долго, вот когда создаются инструменты автоматизации, такие как
make
вставьте (хотя я делаю это с помощью сценария оболочки)