在C中包含外部库

iro*_*ion 4 c cs50

我正在尝试将C库用于哈佛大学的开放课程.可以在此处找到教师有关设置外部库的说明.

我正在按照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);
}
Run Code Online (Sandbox Code Playgroud)

$ gcc helloWorld.c

/tmp/ccYilBgA.o: In function `main':
helloWorld.c:(.text+0x16): undefined reference to `GetString'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我按照指示中的说明按照说明进行了操作,但它们对我不起作用.我正在运行ubuntu 12.04.如果我能进一步澄清我的问题,请告诉我.

Bas*_*tch 21

首先,作为初学者,您应该总是要求GC​​C编译并启用所有警告和调试信息,即 gcc -Wall -g

然后你可能会遗漏一些哈佛特定的库,一些选项如gcc后跟一个库目录,然后-L粘贴到库名.所以你可能需要-l(用gcc -Wall -g -lcs50适当的名字替换),你可能需要一些cs50dir

请注意,程序参数的顺序-L很重要.作为一般规则,如果gcc取决于a你应该放在b前面a; 我建议更具体

  1. b程序名称开始; 添加C标准级别,例如,gcc如果需要
  2. 放置编译器警告,调试(或优化)选项,例如-std=c99(您甚至可能希望添加-Wall -g以获得更多警告).
  3. 放置预处理器的定义和包含目录,例如-Wextra-DONE=1
  4. 把你的C源文件-Imy-include-dir/
  5. 放置您要链接的任何目标文件,即 hello.c
  6. bar.o如果相关,请放置库目录
  7. PUR库名称-Lmy-lib-dir/-laa(当-lbb取决于libaa.so,按照这个顺序)
  8. 结束时libbb.so给出生成的二进制文件的名称.不要使用默认名称-o your-program-name

提供选项a.out(用于预处理器包括)和-I库的目录可以多次给出,顺序很重要(搜索顺序).

你很快就会想要使用像这样的构建工具 -L

还要学习使用调试器 make

养成总是要求编译器发出警告的习惯,并始终改进你的程序,直到你得不到警告:编译器是你的朋友,它正在帮助你!

玩得开心.

  • 这是一个优秀而简洁的gcc tut.再次感谢您的帮助. (4认同)

Gun*_*ach 12

我学习这门课程,有时我需要在旅行或通勤时离线练习。在Windows下使用MinGW和Notepad++作为IDE(因为我喜欢它并且通常在编写python时使用它)我终于找到了一个解决方案并花了一些时间把它写下来。

从头开始。设置gcc C编译器的步骤,如果已经设置请跳至5

  1. 下载 Git并安装。它包括 Git Bash,这是 MINGW64 Linux 终端。我更喜欢使用 Git,因为我需要 Windows 上的 sed、awk、pull、push 等 Linux 工具,并且可以替代 Guthub 的终端。
  2. 安装 Git 后,请确保安装了 gcc 软件包。您可以参考我的配置...MinGW 安装管理器 - gcc
  3. 确保你的编译器可以工作。扔掉这个简单的代码,

    • 将其保存在工作目录Documents/Harvard_CS50/Week2/ hello.c中
    #include <stdio.h>
    
    int main(void)
    {
     printf("Hello StackOverflow\n");
    }
    
    Run Code Online (Sandbox Code Playgroud)
    • 启动Git Bash -> 导航到工作目录

    cd 文件/Harvard_CS50/Week2/

    • 在 bash 终端中编译它

    gcc helloworld.c -o helloworld.exe

    • 使用 bash 终端执行它

    ./helloworld.exe

    你好堆栈溢出

    1. 如果您看到Hello StackOverflow,则您的编译器可以工作并且您可以编写 C 代码。

现在到了重要的一点,在本地安装 CS50 库并离线使用它。这应该适用于课程后面介绍的任何其他库。

  1. 从https://github.com/cs50/libcs ​​50/tree/develop/src 下载最新的源代码文件 cs50.c 和头文件 cs50.h并将其保存在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 libcs​​50.a cs50.o

  5. 完成所有这些步骤后,我们在原始文件中添加了 2 个附加文件。我们只对其中 2 个感兴趣cs50.h libcs​​50.a

    LS

    cs50.c cs50.h cs50.o libcs​​50.a

  6. 将库和头文件复制到其目标位置。我的 MinGW 安装在 C:\ 所以我将它们复制到那里

    cs50.h --> C:\MinGW\include

    libcs​​50.a --> C:\MinGW\lib

测试 cs50 库

为了确保我们的库正常工作,我们可以在讲座中抛出一个示例脚本,看看是否可以使用 get_string() 方法的 cs50.h 头文件对其进行编译。

#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); 
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用 gcc 和 cs50 库编译 cs50 代码。我想明确并使用:

    gcc -ggdb -std=c99 -Wall -Werror test.c -lcs50 -o test.exe

    但你可以简单地指出源、输出文件名和cs50库

    gcc test.c -o test.exe -lcs50

在这里,程序是使用标头编译的,并且可以在其中使用方法。

如果您希望 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"
Run Code Online (Sandbox Code Playgroud)

在 Notepad++ 中运行 CS50 代码

  • Windows 用户的完美答案!感谢您对图像的详尽解释。我想补充一点,对于第 10 步,您要查找的文件夹位置应包含“stdio.h”文件。对我来说,它是:包含“include”和“lib”文件夹的“C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32”我需要。另外,还要感谢 faizan-rizvi,他在答案中提供了进一步的线索(选项 2,步骤 2)。 (2认同)