在C中包含外部库

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

我正在按照ubuntu特有的说明进行操作,因为我试图在我的ubuntu盒子上使用这个lib。 我按照页面上的说明进行设置,但是当我使用cs50库函数运行一个简单的helloWorld.c程序时,gcc不想播放。

例:

helloWorld.c

 #include  #include  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。 如果我能进一步澄清我的问题,请告诉我。

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

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

请注意, gcc的程序参数顺序很重要。 作为一般规则,如果a取决于b你应该放在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. -laa库名-laa-lbb (当libaa.so依赖于libbb.so时, libaa.so顺序)
  8. -o your-program-name结尾,以给出生成的二进制文件的名称。 不要使用默认名称a.out

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

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

还要学习使用调试器gdb

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

玩得开心。

您需要在编译期间链接库。 如果你在Ubuntu上,那么库应该以.a或.so结尾。 要链接到库:

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

你必须链接到图书馆,为什么GCC会知道你想要使用哪个图书馆?

 gcc helloWorld.c -lcs50 
  1. 从以下url下载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行到最后}}并将其粘贴到#endif上方的cs50.h中并保存文件。
  4. 现在,您可以将文件cs50.h复制到默认库文件夹或当前工作文件夹。
  5. 如果将文件复制到默认文件夹,则使用:#include ,如果将文件复制到当前工作文件夹,则使用:#include“cs50.h”。

如果您需要帮助,可以通过faizan4427@gmail.com与我联系,如果有效,请投票。

祝一切顺利!!!

我选修这门课程,有时候我需要在旅行或上下class时离线练习。 在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  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. 从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个文件添加到原始文件中。 我们只对其中的两个 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库

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

 #include  #include  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. 使用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" 

在Notepad ++中运行CS50代码