了解要传递给编译器的标志

时间:2013-03-12 07:34:02

标签: xcode macos command-line compilation

我有一个程序,在XCode中,编译和运行完美。它实际上是Apple的CoreAudio示例程序之一;

http://developer.apple.com/library/mac/#samplecode/PlayFile/Listings/PlayFile_cpp.html

我所提出的问题并非专门针对此代码,而是更为一般;我想更好地理解编译和链接过程; XCode让我有点抽象。我似乎无法理解应该传递哪些标志来进行编译,更不用说为什么了。

我知道标题不在默认的构建路径上,因此需要告诉clang它们在哪里;我用-I./PublicUtility和clang现在可以找到头文件了。

此应用程序还链接到CoreAudio框架,因此当应用程序使用框架中的代码时,与链接到库相比,编译器需要做些什么?

(我知道库和框架之间的区别不明确:What is the major difference between a framework and a toolkit?

现在,在尝试编译PlayFile方面,我有命令

clang++ PlayFile.cpp -I./PublicUtility -o playfile

我试图通知编译器使用-F查找框架,并使用-L查找库(尽管如果我正在阅读此应用程序的代码,它只链接到框架,而不是任何库。

我已经阅读了man页面和gnu编译器的文档(clang是gcc兼容的,所以传递给gcc的标志应该与clang兼容吗?) 但从目前来看,这一切似乎都有点抽象。

任何人都可以了解在什么情况下需要传递的标志?

在另一个用户的评论中,我发现了xcode用于编译程序的命令,但是我仍然有点迷失。

xcode发出的所有命令都与名为~/Library/Developer/Xcode/DerivedData的目录相关。我更接近于理解xcode如何构建程序,但我的源文件都不在此目录中。我如何改变XCode提供给编译器以在XCode之外编译的参数?这个目录是否只是XCode用于在将对象文件构建到程序之前包含的保留位置?

有些论点我还是不明白;他们是否需要编译应用程序甚至是他们的意思。

指定了之前列出的包含或框架的那些。

fmessage-length=0 -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wno-receiver-is-weak -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-enum-conversion -Wno-shorten-64-to-32 -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -Wno-c++11-extensions -fasm-blocks -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -Winvalid-offsetof -g -fvisibility=hidden -fvisibility-inlines-hidden -Wno-sign-conversion

Wno-trigraphs-Wno-c++11-extensions似乎非常自我解释: 不解释代码中的三字符,如果我猜错了,不要使用c ++ 11扩展名吗?

要求提供所有这些内容的定义会很愚蠢,但有些内容(例如-fpascal-strings)在快速谷歌搜索中没有给出任何结果。这甚至都不是用pascal写的!

进一步查看命令;

-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include

在一个命令中包含3次。

其中一些基本上是无关紧要的,还是我错过了一些基本概念?

1 个答案:

答案 0 :(得分:3)

  

Wno-trigraphs和-Wno-c ++ 11-extensions似乎非常自我解释:如果我猜错了,不要在代码中解释三字符并且不要使用c ++ 11扩展?

不完全。首先,-W是启用(和禁用)警告的标志,因此您知道这些标志只是警告,而不是更改任何编译器功能。其次,no-是导致-W标志禁用命名警告的前缀,而没有此前缀则启用警告。因此,当您使用trigraphs和C ++ 11扩展时,这些标志会禁用警告。

  

要求所有这些的定义是愚蠢的,但有些像-fpascal字符串在快速谷歌搜索中没有给出结果。这甚至都不是用pascal写的!

字符串数据有两种基本数据结构。在使用它们的语言之后,它们分别被命名为“C字符串”和“Pascal字符串”,但是一般策略可以在这些语言之外使用。 “C字符串”是一个字符串,其长度由终止空字符确定。 'Pascal字符串'是一个字符串,其长度存储在字符串数据之前。

-f标志控制编译器功能,因此-fpascal-strings启用扩展,您可以在其中指定字符串文字将是pascal字符串而不是c字符串。 C和C ++的扩展通常如下所示:

char const *c = "\phello, world!";

\p转义字符将字符串文字指定为pascal字符串,字符串的初始字节将是字符串的长度。在这种情况下,c[0]将为13.也可以手动创建pascal字符串"\xDhello, world!",但这需要手动计数,并且在更改字符串时必须更新数字。