2

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

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

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

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

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

(我知道库和框架之间的区别不清楚:框架和工具包之间的主要区别是什么?

现在,就尝试编译 PlayFile 而言,我有命令

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

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

我已经阅读了 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,在快速谷歌搜索中没有给出任何结果。这些甚至都不是用帕斯卡写的!

进一步查看命令;

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

在一个命令中包含 3 次。

其中一些基本上是无关紧要的,还是我在这里遗漏了一些基本概念?

4

1 回答 1

3

Wno-trigraphs 和 -Wno-c++11-extensions 似乎很容易解释:如果我猜对了,不要解释代码中的 trigraphs 并且不要使用 c++11 扩展?

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

要求对所有这些进行定义是愚蠢的,但是有些,例如 -fpascal-strings,在快速的 google 搜索中没有给出任何结果。这些甚至都不是用帕斯卡写的!

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

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

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

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

于 2013-03-12T16:39:51.500 回答