我正在尝试将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。如果我能进一步澄清我的问题,请告诉我。
答案 0 :(得分:19)
首先,作为初学者,您应该总是要求GCC编译并启用所有警告和调试信息,即gcc -Wall -g
然后你可能错过了一些哈佛特定的库,一些选项如-L
后跟一个库目录,然后-l
粘在库名。所以你可能需要gcc -Wall -g -lcs50
(用适当的名称替换cs50
),你可能需要一些-L
some-dir
请注意,gcc
的程序参数顺序很重要。作为一般规则,如果a
取决于b
,则应将a
放在b
之前;更具体地说,我建议
gcc
程序名称开始;添加 C 标准级别,例如-std=c99
,如果需要-Wall -g
(您甚至可能希望添加-Wextra
以获取更多警告)。-DONE=1
和-Imy-include-dir/
hello.c
bar.o
-Lmy-lib-dir/
(如果相关)-laa
和-lbb
(当libaa.so
依赖于libbb.so
时,按此顺序)-o your-program-name
结束,以提供生成的二进制文件的名称。请勿使用默认名称a.out
为库提供选项-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)
OR ============================================== =======================&GT;
如果您需要帮助,可以通过faizan4427@gmail.com与我联系,如果有效,请投票。
一切顺利!!!
答案 4 :(得分:0)
我参加这门课程,有时候我需要在旅行或上下班时离线练习。在Windows下使用MinGW和Notepad ++作为IDE(因为我喜欢它并且通常在编写python时使用它)我终于找到了一个解决方案并且有时间将其写下来。
从头开始。设置gcc C编译器的步骤,如果已经设置,请跳到5
确保您的编译器正常工作。抛出这个简单的代码,
#include <stdio.h> int main(void) { printf("Hello StackOverflow\n"); }
cd Documents / Harvard_CS50 / Week2 /
gcc helloworld.c -o helloworld.exe
HelloWorld.exe的./
Hello StackOverflow
现在重要一点,在本地安装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 - &gt; C:\ MinGW的\包含
libcs50.a - &gt; 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);
}
使用gcc和cs50库编译cs50代码。我希望明确并使用:
gcc -ggdb -std = c99 -Wall -Werror test.c -lcs50 -o test.exe
但您可以简单地指出源,输出文件名和cs50库
gcc test.c -o test.exe -lcs50
这里我们去,程序是使用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"