我有一个程序,在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次。
其中一些基本上是无关紧要的,还是我错过了一些基本概念?
答案 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!"
,但这需要手动计数,并且在更改字符串时必须更新数字。