Включить внешнюю библиотеку в 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; более конкретно я предлагаю

  1. Начните с gcc название программы; добавить стандартный уровень C, например -std=c99 если хотел
  2. Поместите предупреждение компилятора, параметры отладки (или оптимизации), например -Wall -g (вы можете даже добавить -Wextra чтобы получить еще больше предупреждений).
  3. Поместите определения препроцессора и включите каталог, например -DONE=1 а также -Imy-include-dir/
  4. Поместите ваш исходный файл C hello.c
  5. Поместите любые объектные файлы, с которыми вы ссылаетесь, т.е. bar.o
  6. Положите каталоги библиотеки -Lmy-lib-dir/ если актуально
  7. Pur имена библиотек -laa а также -lbb (когда libaa.so зависит от libbb.so, в этой последовательности)
  8. Конец с -o your-program-name дать название произведенного двоичного файла. Не используйте имя по умолчанию a.out

Варианты предоставления каталогов -I (для препроцессора входит) и -L для библиотек можно указывать несколько раз, порядок значим (порядок поиска).

Очень быстро вы захотите использовать такие инструменты, как make

Научитесь также использовать отладчик gdb

Получите привычку всегда запрашивать предупреждения у компилятора и всегда улучшайте свою программу, пока не получите никаких предупреждений: компилятор - ваш друг, он помогает вам!

Повеселись.

Я беру этот курс, и иногда мне нужно практиковаться в автономном режиме во время поездок или поездок на работу. Под Windows, используя MinGW и Notepad++ в качестве IDE (потому что я люблю его и использую его обычно при кодировании python), я наконец нашел решение и некоторое время записал его.

Начиная с нуля. Шаги по настройке компилятора gcc C, если он уже установлен, перейдите к 5

  1. Скачайте Git и установите. Он включает в себя Git Bash, который является терминалом MINGW64 для Linux. Я предпочитаю использовать Git, так как мне нужны инструменты Linux, такие как sed, awk, pull, push на моей Windows, и они могут заменить терминал Guthub.
  2. После установки Git убедитесь, что установлены пакеты gcc. Вы можете использовать мою конфигурацию для справки... Менеджер установки MinGW - gcc
  3. Убедитесь, что ваш компилятор работает. Брось этот простой код,

    • сохранив его в своем рабочем каталоге 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

    1. Если вы видите Hello Stackru, ваш компилятор работает, и вы можете написать C-код.

Теперь о важном: установка библиотеки CS50 локально и использование ее в автономном режиме. Это должно быть применимо для любых других библиотек, представленных позже в курсе.

  1. Загрузите последний файл исходного кода cs50.c и заголовочный файл cs50.h с https://github.com/cs50/libcs50/tree/develop/src и сохраните их в Documents/Harvard_CS50/src

  2. Перейдите в каталог src и перечислите файлы, чтобы убедиться, что вы находитесь в нужном месте, используя

    Ls

    cs50.c cs50.h

  3. Круто, мы здесь. Теперь нам нужно скомпилировать объектный файл для библиотеки, используя

    gcc -c -ggdb -std=c99 cs50.c -o cs50.o

  4. Теперь, используя сгенерированный объектный файл cs50.o, мы можем создать наш архивный файл библиотеки cs50.

    ar rcs libcs50.a cs50.o

  5. После всех этих шагов мы закончили с 2 дополнительными файлами к нашим оригинальным файлам. Нас интересуют только 2 из них cs50.h libcs50.a

    Ls

    cs50.c cs50.h cs50.o libcs50.a

  6. Скопируйте библиотеку и заголовочные файлы в их целевые местоположения. Мой 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); 
}
  1. Скомпилируйте код 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 в Notepad

  1. Загрузите cs50 по адресу: http://mirror.cs50.net/library50/c/library50-c-5.zip
  2. Извлеките это. (Вы получите два файла cs50.c и cs50.h)
  3. Теперь скопируйте оба файла в папку библиотеки по умолчанию. (который включает в себя ваш файл stdio.h)
  4. Теперь при написании вашей программы используйте: #include
  5. Вы также можете скопировать файлы в папку, содержащую файл helloWorld.c.
  6. Вы должны использовать: #include " cs50.c ".

ИЛИ ===========================================================================>

  1. Откройте файлы cs50.c и cs50.h в текстовом редакторе.
  2. В cs50.h, чуть ниже #include добавьте #include и #include в новой строке.
  3. Теперь откройте файл cs50.c, скопируйте все (из: /** Считывает строку текста из стандартного ввода и возвращает эквивалент {от строки 47 до последней}) и вставьте его в cs50.h чуть выше #endif и сохраните файлы.
  4. Теперь вы можете скопировать файл cs50.h либо в вашу папку библиотеки по умолчанию, либо в вашу текущую рабочую папку.
  5. Если вы скопировали файл в папку по умолчанию, используйте: #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: здесь не имеет значения

План:

  1. получение исходных файлов
  2. создание необходимых файлов: *.o(объект) и (архив)
  3. говорит компилятору использовать его

Действие:

  1. Скажем, текущий каталог = "desktop/cs50"
    . Он содержит все файлы, такие как test-file.c, которые я буду создавать для заданий/наборов задач/тренировок и т. д.

  2. Получить и *.cфайлы
    Источник в этом конкретном случае: https://github.com/cs50/libcs50/tree/main/src

    1. Просмотрите каждый файл в отдельности
    2. Скопируйте все его содержимое.
      Скажите, используя значок «Копировать необработанное содержимое» отдельных файлов.
    3. Создайте соответствующий файл локально на компьютере.
      Сделайте это в отдельной папке, чтобы все было чисто, скажем, в «desktop/cs50/src», также известном как «desktop/cs50/src». ./src
  3. Создайте необходимые файлы, используя терминал после изменения текущего каталога на «desktop/cs50/src»:

    1. gcc -c cs50.cдля создания объектного файла "cs50.o" из "cs50.c" с помощью "gcc"
    2. ar cr libcs50.a cs50.oсоздать архивный файл "libcs50.a", который будет содержать объектный файл "cs50.o"
    • Здесь «libcs50» = префикс «lib» + имя «cs50» (то же, что и имя заголовочного файла)
    • Это нормальный/стандартный способ, когда префикс «lib» также важен для более позднего шага.
    • Однако префикс можно пропустить, и имя также не обязательно должно совпадать с именем заголовочного файла. Тем не менее, пропускать префикс не рекомендуется. И я не могу точно сказать о части имени
  4. Чтобы компилятор мог использовать эту инфраструктуру, команды будут иметь следующий синтаксис после перехода в родительский каталог (т.е. в «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вставьте (хотя я делаю это с помощью сценария оболочки)
Другие вопросы по тегам