在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。 如果我能进一步澄清我的问题,请告诉我。
首先,作为初学者,你应该总是要求GCC编译并启用所有警告和调试信息,即gcc -Wall -g
然后你可能会遗漏一些哈佛特定的库,一些选项如-L
后跟一个库目录,然后-l
粘贴到库名。 所以你可能需要gcc -Wall -g -lcs50
(用适当的名字替换cs50
)你可能需要一些-L
some-dir
请注意, gcc
的程序参数顺序很重要。 作为一般规则,如果a
取决于b
你应该放在b
之前; 我建议更具体
- 从
gcc
程序名开始; 如果需要,添加C标准级别,例如-std=c99
- 放置编译器警告,调试(或优化)选项,例如
-Wall -g
(您甚至可能希望添加-Wextra
以获得更多警告)。 - 放置预处理器的定义和包含目录,例如
-DONE=1
和-Imy-include-dir/
- 把你的C源文件
hello.c
- 放置您要链接的任何对象文件,即
bar.o
- 如果相关,放置库目录
-Lmy-lib-dir/
-
-laa
库名-laa
和-lbb
(当libaa.so
依赖于libbb.so
时,libaa.so
顺序) - 以
-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
- 从以下url下载cs50: http ://mirror.cs50.net/library50/c/library50-c-5.zip
- 提取它。 (你将得到两个文件cs50.c和cs50.h)
- 现在将这两个文件复制到默认库文件夹。 (包括你的stdio.h文件)
- 现在编写程序时使用:#include
- 您还可以将文件复制到包含helloWorld.c文件的文件夹中。
- 你必须使用:#include“cs50.c”。
或者================================================= ====================>
- 在文本编辑器中打开cs50.c和cs50.h文件。
- 在cs50.h中,在#include
下面,在新行上添加#include 和#include 。 - 现在打开cs50.c文件,复制所有内容(来自:/ **从标准输入读取一行文本并返回等效的{从第47行到最后}}并将其粘贴到#endif上方的cs50.h中并保存文件。
- 现在,您可以将文件cs50.h复制到默认库文件夹或当前工作文件夹。
- 如果将文件复制到默认文件夹,则使用:#include
,如果将文件复制到当前工作文件夹,则使用:#include“cs50.h”。
如果您需要帮助,可以通过faizan4427@gmail.com与我联系,如果有效,请投票。
祝一切顺利!!!
我选修这门课程,有时候我需要在旅行或上下class时离线练习。 在Windows下使用MinGW和Notepad ++作为IDE(因为我喜欢它并且通常在编写python时使用它)我终于找到了一个解决方案并且有时间将其写下来。
从头开始。 设置gcc C编译器的步骤,如果已经设置,请跳到5
- 下载Git并安装。 它包括Git Bash,它是MINGW64 linux终端。 我更喜欢使用Git,因为我需要Linux工具,如sed,awk,pull,push在我的Windows上,并且可以替换Guthub的终端。
- 安装Git后确保安装了gcc软件包。 您可以使用我的配置作为参考…
-
确保您的编译器正常工作。 抛出这个简单的代码,
- 将其保存在工作目录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
- 如果你看到Hello StackOverflow ,你的编译器可以工作,你可以编写C代码。
现在重要一点,在本地安装CS50库并离线使用它。 这应该适用于课程后面介绍的任何其他库。
-
从https://github.com/cs50/libcs50/tree/develop/src下载最新的源代码文件cs50.c和头文件cs50.h并将它们保存在Documents / Harvard_CS50 / src中
-
导航到src目录并列出文件以确保您使用的位置正确
LS
cs50.c cs50.h
-
很酷,我们在这里。 现在我们需要使用编译库的目标文件
gcc -c -ggdb -std = c99 cs50.c -o cs50.o
-
现在使用生成的cs50.o对象文件,我们可以创建我们的cs50库归档文件。
ar rcs libcs50.a cs50.o
-
完成所有这些步骤后,我们最终将2个文件添加到原始文件中。 我们只对其中的两个 cs50.h libcs50.a 感兴趣
LS
cs50.c cs50.h cs50.o libcs50.a
-
将库和头文件复制到其目标位置。 我的MinGW安装在C:\中,所以我将它们复制到那里
cs50.h – > C:\ MinGW \ include
libcs50.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); }
-
使用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"