2010-05-18 72 views
3

在这些日子里,我在玩线程库并试图实现一些功能。 本教程的一种说法是:运行程序使用:揭秘lpthreads下的gcc

gcc -lpthread -lrt -lc -lm project1.c scheduler.c -o out 

首先,我需要的是什么GCC中的每一行做深入的了解,

  • lpthread是用来做什么? lrt -lc -lm有什么贡献?

  • project1.c和scheduler.c是一起编译的,所以我应该理解什么?我检查了
    的代码,其中任何一个都没有包含在project1.c或scheduler.c中。

  • 作为输出显然它给出了“out”。

其次笔者指出运行,你必须使用

./out number filename (For example, ./out 2 sample.txt) 

为了使这些清楚据我了解的主要功能得到数量和sample.txt的作为输入。(该计划? )

感谢您的回答,并让我清楚。

+1

如果我是你,我会尝试删除'-lrt -lc'开关出于好奇。我怀疑这个程序仍然会在没有它们的情况下编译,但我不确定。 – 2010-05-18 22:00:49

+0

@乔伊亚当斯,是的,它的工作原理。 – berkay 2010-05-18 22:05:11

回答

8

-l参数表示 - 指向特定库的链接。更多信息请参见GCC manual

因此-lpthread装置连结libpthread.so(或pthread.a) 同样对于-lm-lrt-lc

[LIB]并行线程[。所以] - POSIX threads

[LIB ] M [。所以] - 数学标准库(正弦,余弦等)

[LIB] RT [。所以] - POSIX realtime extensions

[LIB] C [。所以] - 的libc(标准C库)

.c文件中的每一个被编译为.o对象文件(这些被称为编译单元),并与上述的库链接在一起。

你说得对如何传递命令行参数是正确的。

+0

谢谢,不清楚的问题是为什么链接?如果我在我的.c文件中包含库,为什么我需要使用它?你能否以c,C++处理这些问题的方式向我推荐一些教程? (我想我有一些问题来了解c,C++编译的细节) – berkay 2010-05-18 22:19:29

+1

@Berkay:头文件通常只声明*声明过程和全局变量。 (函数签名不包含主体)。通过链接库提供实际的身体*解决*否则未解决的参考。 也就是说,通过包含你承诺编译器的头文件,你确实有这样一个函数。编译器留下了一个引用,后来由库中的链接器填充。 – EFraim 2010-05-18 22:20:49

+1

关于链接的这一章http://publications.gbdirect.co.uk/c_book/chapter4/linkage.html可以提供帮助。 – EFraim 2010-05-18 22:22:38

4

-lxxx意味着链接名为libxxx库,所以你告诉它链接libpthreadlibrtlibclibm

你真的不需要指定链接libc - 这通常是默认情况下发生的。 libm是数学库,因此大多数代码都需要它来执行浮点操作。 libpthread包含pthreads函数(例如,pthread_create),因此任何创建/使用pthread的代码都需要链接到它。

project1.c和scheduler.c被一起编译意味着一个代码可以调用另一个中的代码。

您对命令行参数的理解看起来是正确的。

+0

project1.c和scheduler.c被编译在一起意味着一个代码可以调用另一个中的代码:所以我明白一些外部函数正在使用中。 – berkay 2010-05-18 22:01:49

+0

@Berkay:是的,这是正确的。 – 2010-05-18 22:09:15

1

为输出清楚它给

是你指定的这个与-o out


GCC不只是你.c文件编译为.o文件“走出去”,但还链接编译文件和您用-l指定的库合并为一个二进制文件。


./out number filename (For example, ./out 2 sample.txt) 

号和文件名与出了名的程序两个参数。

+0

为什么我应该是任何一种机器人? ;) – TheMorph 2010-05-18 22:03:52

+0

感谢您的回答,我感谢您只能将不明确的问题,而不是复制。 – berkay 2010-05-18 22:09:32