gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:07:23 25 4
gpt4 key购买 nike

我有一个程序,它在 XCode 中可以完美地编译和运行。它实际上是Apple为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 的框架和带有 -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 ,在快速谷歌搜索中没有结果。这些甚至都不是用 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转义字符将字符串文字指定为帕斯卡字符串,字符串的初始字节将是字符串的长度。在这种情况下 c[0]将是 13。也可以手动创建 pascal 字符串, "\xDhello, world!" ,但这需要手动计数,并且在更改字符串时必须更新数字。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com