我有一个程序,它在 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 次。
其中一些基本上是无关紧要的,还是我在这里遗漏了一些基本概念?