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

标签 xcode macos command-line compilation

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

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

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

我知道 header 不在默认构建路径上,因此需要告诉 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 向编译器发出信号,用 -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-接收器弱-Wno-非虚拟-dtor -Wno-重载-虚拟-Wno-退出时间-析构函数-Wformat -Wno-缺失大括号-W括号-Wswitch -Wno-未使用的功能-Wno-未使用-标签 -Wno-unused-parameter -Wunused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-常量转换 -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 次。

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

最佳答案

Wno-trigraphs and -Wno-c++11-extensions seem pretty self explanatory: Dont interpret trigraphs in the code and dont use c++11 extensions if I'm guessing correctly?

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

It would be silly to ask for a definition of all of these, but some, like -fpascal-strings, give no results on a quick google search. And none of this is even written in pascal!

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

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

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

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

关于xcode - 了解要传递给编译器的标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15355648/

相关文章:

visual-studio - TFS命令行 'Get'失败

objective-c - 路由我 : Location & Screen Position

ios - 如何使用 UIStackView 创建动态标签

macos - 如何在滚动和击中缓冲区底部的顶部时阻止 Emacs (Cocoa OSX) 发出噪音?

java - 如何在命令行中输入星号以使其能够理解?

linux - 复杂的 shell 通配符

ios - 尝试使用 Xcode 4.2 iOS 5 从 UIWebView 推送到详细 View

Xcode 将代码移动到新项目

ios - 更改边界大小后 CALayer 的位置

macos - rbenv global 不设置 ruby