在C中包含外部库

时间:2012-07-28 05:13:26

标签: c cs50

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

我正在按照ubuntu特有的说明进行操作,因为我试图在我的ubuntu盒子上使用这个lib。我按照页面上的说明进行设置,但是当我使用cs50库函数运行一个简单的helloWorld.c程序时,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。如果我能进一步澄清我的问题,请告诉我。

5 个答案:

答案 0 :(得分:19)

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

然后你可能错过了一些哈佛特定的库,一些选项如-L后跟一个库目录,然后-l粘在库名。所以你可能需要gcc -Wall -g -lcs50(用适当的名称替换cs50),你可能需要一些-L some-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. 清除库名-laa-lbb(当libaa.so依赖于libbb.so时,按此顺序)
  8. -o your-program-name结束,以提供生成的二进制文件的名称。请勿使用默认名称a.out
  9. 为库提供选项-I(对于预处理器包括)和-L的目录可以多次给出,顺序很重要(搜索顺序)。

    很快你就会想要使用像make

    这样的构建工具

    还要学习使用调试器gdb

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

    玩得开心。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

你必须链接到库,GCC怎么会知道你想要使用哪个库?

gcc helloWorld.c -lcs50

答案 3 :(得分:1)

  1. http://mirror.cs50.net/library50/c/library50-c-5.zip
  2. 下载cs50
  3. 提取它。 (您将获得两个文件cs50.c和cs50.h)
  4. 现在将这两个文件复制到默认库文件夹中。 (包括您的stdio.h文件)
  5. 现在编写程序时使用:#include&lt; cs50.c&gt;
  6. 您也可以将文件复制到包含helloWorld.c文件的文件夹中。
  7. 您必须使用:#include&#34; cs50.c&#34;。
  8. OR ============================================== =======================&GT;

    1. 在文本编辑器中打开cs50.c和cs50.h文件。
    2. 在cs50.h中,正好在#include&lt;下面stdlib.h&gt;添加#include&lt; stdio.h&gt;和#include&lt; string.h&gt;两者都在新线上。
    3. 现在打开cs50.c文件,复制所有内容(来自:/ **从标准输入读取一行文本并返回等效的{从第47行到最后}}并将其粘贴到#endif上方的cs50.h中并保存文件。
    4. 现在您可以将文件cs50.h复制到默认库文件夹或当前工作文件夹。
    5. 如果您将文件复制到默认文件夹,请使用:#include&lt; cs50.h&gt;如果您将文件复制到当前工作文件夹,请使用:#include&#34; cs50.h&#34;。
    6. 如果您需要帮助,可以通过faizan4427@gmail.com与我联系,如果有效,请投票。

      一切顺利!!!

答案 4 :(得分:0)

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

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

  1. Download Git并安装。它包括Git Bash,它是MINGW64 linux终端。我更喜欢使用Git,因为我需要Linux工具,如sed,awk,pull,push在我的Windows上,可以替换Guthub的终端。
  2. 安装Git后,请确保已安装gcc软件包。您可以使用我的配置作为参考... MinGW Installation Manager - gcc
  3. 确保您的编译器正常工作。抛出这个简单的代码,

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

    cd Documents / Harvard_CS50 / Week2 /

    • 在bash终端中编译
      

    gcc helloworld.c -o helloworld.exe

    • 使用bash终端执行
      

    HelloWorld.exe的./

         

    Hello StackOverflow

    1. 如果您看到 Hello StackOverflow ,您的编译器可以工作,您可以编写C代码。
  4. 现在重要一点,在本地安装CS50库并离线使用它。这应该适用于课程后面介绍的任何其他库。

    1. https://github.com/cs50/libcs50/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 - &gt; C:\ MinGW的\包含

      libcs​​50.a - &gt; C:\ MinGW的\ lib中

    7. 测试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. 使用gcc和cs50库编译cs50代码。我希望明确并使用:

          

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

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

          

        gcc test.c -o test.exe -lcs50

      2. 这里我们去,程序是使用header和方法编译的。

        If you want Notepad++ as an IDE you can follow this tip to set it up with gcc as a compiler and run your code from there。 只需确保您的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 CS50 Code in Notepad++