Включить внешнюю библиотеку в C

Я пытаюсь использовать библиотеку C для курса opencourseware из Гарварда. Инструкции инструктора по настройке внешней библиотеки можно найти здесь.

Я следую инструкциям, относящимся к Ubuntu, поскольку пытаюсь использовать эту библиотеку в своем ящике Ubuntu. Я следовал инструкциям на странице, чтобы настроить его, но когда я запускаю простую программу 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

Я следовал инструкциям к письму, как указано в инструкциях, но они не работали для меня. У меня стоит убунту 12.04. Пожалуйста, дайте мне знать, если я могу уточнить мою проблему.


person ironicaldiction    schedule 28.07.2012    source источник
comment
Включение заголовочного файла просто отмечает прототип функции. Следовательно, ваш файл компилируется нормально, но есть ошибка ссылки. Вы установили библиотеки, как было предложено? Если да, не могли бы вы проверить, правильно ли установлены библиотеки и правильно ли установлена ​​переменная пути, чтобы gcc мог найти эти библиотеки, используя путь?   -  person Chethan Ravindranath    schedule 28.07.2012
comment
gcc helloWorld.c -lcs50 работает?   -  person Alok Singhal    schedule 28.07.2012
comment
да, не понял, что мне нужно было явно ссылаться на библиотеку в строке cmd. Спасибо всем.   -  person ironicaldiction    schedule 28.07.2012
comment
Как еще он узнает, что вы хотите установить связь с этой библиотекой?   -  person Jim Balter    schedule 28.07.2012
comment
Я думал, что #include <cs50.h> будет работать так же, как #include <stdio.h>.   -  person ironicaldiction    schedule 29.07.2012


Ответы (5)


Во-первых, как новичок, вы всегда должны просить GCC скомпилировать все предупреждения и отладочную информацию, то есть gcc -Wall -g. Но когда-нибудь прочитайте Как вызвать gcc. Используйте хороший редактор исходного кода (например, GNU emacs или vim или gedit и т. д.), чтобы редактировать исходный код C, но иметь возможность компилировать программу в командной строке (поэтому не Не всегда используйте сложную IDE, скрывающую от вас важные детали компиляции).

Тогда вам, вероятно, не хватает какой-то конкретной библиотеки Гарварда, некоторых параметров, таких как -L, за которыми следует каталог библиотеки, а затем -l приклеивается к имени библиотеки. Таким образом, вам может понадобиться gcc -Wall -g -lcs50 (замените cs50 на соответствующее имя), и вам может понадобиться -Lкакой-то-каталог

Обратите внимание, что порядок аргументов программы до 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 для библиотек можно указывать несколько раз, порядок имеет значение (порядок поиска).

Очень скоро вы захотите использовать инструменты автоматизации сборки, такие как GNU make (возможно, с помощь remake в Linux)

Узнайте также, как использовать отладчик gdb.

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

Прочтите также Как отлаживать небольшие программы и знаменитый SICP (который обучает очень важным понятиям; вам может понадобиться использовать guile в Linux во время чтения см. http://norvig.com/21-days.html, чтобы узнать больше). Помните также о таких инструментах, как valgrind.

Радоваться, веселиться.

person Basile Starynkevitch    schedule 28.07.2012

Вам нужно связать библиотеку во время компиляции. Библиотека должна заканчиваться на .a или .so, если вы используете Ubuntu. Чтобы связать библиотеку:

gcc -o myProgram myProgram.c -l(library name goes here but no parentheses)
person C0deH4cker    schedule 28.07.2012

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

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

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

    • by saving it in your working directory Documents/Harvard_CS50/Week2/ hello.c
    #include <stdio.h>
    
    int main(void)
    {
     printf("Hello StackOverflow\n");
    }
    
    • запустить Git Bash -> перейти в рабочий каталог

    cd Documents/Harvard_CS50/Week2/

    • скомпилировать его в терминале bash

    gcc helloworld.c -o helloworld.exe

    • выполнить его с помощью терминала bash

    ./helloworld.exe

    Привет StackOverflow

    1. Если вы видите Hello StackOverflow, ваш компилятор работает, и вы можете писать код 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. #P11# <блочная цитата> #P12#
  4. #P13# <блочная цитата> #P14#
  5. После всех этих шагов мы закончили с двумя дополнительными файлами к нашим исходным файлам. Нас интересуют только 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. #P22#
    #P23#
    #P24#
    #P25#

Итак, программа скомпилирована с использованием заголовка, и внутри можно использовать методы.

Если вам нужен Notepad++ в качестве IDE, вы можете следовать этот совет, чтобы настроить его с помощью 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++

person Gunay Anach    schedule 18.08.2017
comment
Идеальный ответ для пользователей Windows! Спасибо за подробное объяснение с изображениями. Я хотел бы добавить, что для шага 10 папка, которую вы ищете, должна содержать файл stdio.h. Для меня это было: C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32, в котором находились нужные мне папки include и lib. Кроме того, спасибо faizan-rizvi, который предоставил дополнительную подсказку в своем ответе (вариант 2, шаг 2). - person datalifenyc; 06.09.2020

Вы должны ссылаться на библиотеку, откуда GCC узнает, какую библиотеку вы хотите использовать?

gcc helloWorld.c -lcs50
person Community    schedule 28.07.2012

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

OR =====================================================================>

  1. Откройте файлы cs50.c и cs50.h в текстовом редакторе.
  2. В cs50.h чуть ниже #include ‹ stdlib.h > добавьте #include ‹ stdio.h > и #include ‹ string.h > на новой строке.
  3. Теперь откройте файл cs50.c, скопируйте все (из: /** Читает строку текста из стандартного ввода и возвращает эквивалент {от строки 47 до последней}) и вставьте ее в cs50.h чуть выше #endif и сохраните файлы.
  4. Теперь вы можете скопировать файл cs50.h либо в папку библиотеки по умолчанию, либо в текущую рабочую папку.
  5. Если вы скопировали файл в папку по умолчанию, используйте: #include ‹ cs50.h >, а если вы скопировали файлы в текущую рабочую папку, используйте: #include " cs50.h ".

Если вам нужна помощь, вы можете обратиться ко мне по адресу [email protected], и если это сработало, пожалуйста, проголосуйте.

Всего наилучшего!!!

person Faizan Rizvi    schedule 26.03.2016