我是使用gcc的新手,所以我有几个问题。
以下开关实现了什么:
gcc -v -lm -lfftw3 code.c
我知道lfftw3
是与.h
一起使用的code.c
文件,但为什么它是命令的一部分?
我无法找到-lm
在搜索中的作用。它做了什么?
我想我发现-v
会导致gcc显示由它调用的程序。
答案 0 :(得分:11)
-l
指定要包含的库。在这种情况下,您将包括数学库(-lm
)和fftw3库(-lffw3
)。库将位于库路径中的某个位置,可能是/ usr / lib,其名称类似于libffw3.so
答案 1 :(得分:4)
来自GCC的手册页:
-v Print (on standard error output) the commands executed to run the stages of compilation. Also print the version number of the compiler driver program and of the preprocessor and the compiler proper.
-l library Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.) It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded. The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified precisely by name. The directories searched include several standard system directories plus any that you specify with -L. Normally the files found this way are library files---archive files whose members are object files. The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined. But if the file that is found is an ordinary object file, it is linked in the usual fashion. The only difference between using an -l option and specifying a file name is that -l surrounds library with lib and .a and searches several directories.
libm
是math.h
使用的库,因此-lm包含该库。您可能希望更好地掌握linking的概念。基本上,该开关会为您的程序添加一堆已编译的代码。
答案 2 :(得分:1)
-lm
将您的程序与数学库相关联。
-v
是编译器的详细(额外输出)标志。
-lfftw3
将您的程序与fftw3库链接。
您只需使用#include "fftw3.h"
添加标题即可。如果要实际包含与其关联的代码,则需要链接它。 -l
就是为了这个。与图书馆联系。
答案 3 :(得分:0)
以-l开头的参数指定链接到程序的库。就像Pablo Santa Cruz所说,-lm是标准的数学库,-lfftw3是一个用于傅里叶变换的库。
答案 4 :(得分:0)
当您尝试了解某个命令时,请尝试man
。
来自man gcc
-v打印(在标准错误输出上)执行的命令以运行 编译阶段。同时打印版本号 COM的 piler驱动程序以及预处理程序和编译器 适当的。
正如Pablo所说,-lm
链接了你的数学库。
-lfftw3
个链接。项目页面可以在这里找到更多信息:
http://www.fftw.org/
所有这些陈述的主要内容是它们将您的代码文件编译成一个程序,该程序将被命名为默认(a.out)并依赖于来自math和Fourier变换库的函数调用。 -v语句只是帮助您跟踪编译过程并诊断应该发生的错误。
答案 5 :(得分:0)
除了man gcc
这应该是关于任何命令的问题的第一站,您还可以尝试几乎标准的--help
选项。即使对于不支持它的命令,不受支持的选项通常会导致它打印包含应该提示类似选项的使用信息的错误。在这种情况下,gcc将显示一个简洁(对于gcc,它只有大约50行)帮助摘要列出了gcc程序本身所理解的少量选项,而不是传递给它的组件程序。在对--help
选项本身进行描述之后,它会列出--target-help
和-v --help
作为获取有关目标体系结构和组件程序的更多信息的方法。
我的MinGW GCC 3.4.5安装在Windows XP上从gcc -v --help
生成超过1200行输出。我很确定在其他安装中不会变小。
阅读official manual for GCC也是一个好主意。阅读链接器(ld
)和汇编器(通常为gas
或仅as
)的文档也很有帮助,但它也可能是某些特定于平台的汇编程序;除了特定于平台的汇编程序外,这些汇编程序还记录为binutils
集合的一部分。
熟悉Unix工具的命令行样式也很有帮助。单字符选项的值可能不会从选项名称分隔的想法是一种基本上与Unix一样的约定。现代约定(由GNU颁布)--
而不是-
引入多字符选项名称意味着-lm
可能是-l m
的同义词(或某些约定中的一对选项-l -m
但gcc
}的情况并非如此,但它可能不是一个名为-lm
的选项。例如,您将看到与控制特定优化的-f
选项或控制警告的-W
选项类似的模式。