- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 clang 的规定通过插件和 clang 的 LibTooling 开发插件和工具。我能够做以下事情:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/
clang++
的 Release+Asserts(和 Debug+Asserts)版本通过附加编译 C++ 源代码-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/
-stdlib=libc++
.使用此标志明确指定 libc++ 作为包含目录允许我构建的 clang 来“查看”标准 c++ 头文件。令人惊讶的是,它在编译一个中等基本的源文件时似乎很满意(它仍然在其中练习了大量的 c++11 疯狂)clang version 3.6.0 (trunk 217905)
查找 Apple 的 Xcode 打包的 libc++。这目前表面上是有效的,因为 Xcode 附带的 Apple 的 libc++ 仍然与我刚刚从源代码构建的编译器 ABI 兼容。我仍然很好奇的是,我新编译的 clang 是如何找出在哪里可以找到相应的 libc++ dylib 的!这在稍后我实际编译 libc++ 时提出了一个问题,我应该如何告诉我的新 svn 编译的 clang 查找并使用新的 svn 编译的 libc++ dylib?
-stdlib=libc++
?
-I~/libcxx/include/c++/v1/
(或其他任何内容)进入构建配置是不雅的。
-stdlib=libc++
神奇地工作。另请注意,Apple 为您提供的 Xcode clang 并不真正要求您使用
-stdlib=libc++
.它只是神奇地知道从哪里获取库文件。
/usr/bin/clang++
:
$ ls -la $(which clang++)
-rwxr-xr-x 1 root wheel 14240 Mar 17 2014 /usr/bin/clang++
make install
从我的 llvm 构建目录!它可能会破坏我的 Xcode 环境或阻止我的 Mac 启动(因为 libc++ llvm 文档明确指出,如果发生不好的事情
/usr/lib/libc++.1.dylib
就会发生)!
clang++ -std=c++11 -stdlib=libc++ -nostdinc++ -I<path-to-libcxx>/include -L<path-to-libcxx>/lib test.cpp
-stdlib=libc++
导致 clang 或什么
-nostdinc++
导致叮当做。
-nostdinc++
意味着没有搜索标准的 C++ 包含路径。这意味着标准包含路径是一回事。构建 clang 时这条路径是硬编码的吗?我用谷歌搜索并找到了一些引用变量
CLANG_INCLUDEPATH
的东西,这看起来可能是一个 makefile 变量。不幸的是,我正在我的 llvm 源目录上运行完整的文件系统文本搜索,但没有找到与此类字符串的匹配项(因此它不能是 clang 或在构建 clang 过程中使用的配置)。
--verbose
,我现在可以看到一些有用的输出:
clang -cc1 version 5.1 based upon LLVM 3.4svn default target x86_64-apple-darwin13.4.0
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
clang -cc1 version 3.6.0 based upon LLVM 3.6.0svn default target x86_64-apple-darwin13.4.0
ignoring nonexistent directory "/Users/username/Documents/llvmbuild/Release+Asserts/bin/../include/c++/v1"
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Users/username/Documents/llvmbuild/Release+Asserts/bin/../lib/clang/3.6.0/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
/Apps/Xcode.app/.../c++/v1/
中找到 libc++。虽然我的 svn clang 没有在它想要查看的地方找到一个(在
Release+Asserts
构建目录中,这看起来很傻,但实际上它可能是 libcxx 将其头文件复制到 llvm 构建系统的位置)。
string
也不行。 (无论如何,这是一个长镜头)。
libc++.dylib
发生了什么事情.我不知道新构建的 clang 是否经过硬编码才能在
/usr/lib/libc++.1.dylib
找到它。 , 或者是什么。我需要这样做:
/usr/lib/libc++.1.dylib
以免破坏我的整个操作系统 clang++
使用 libc++.1.dylib
现已建成,位于与 /usr/lib/libc++.1.dylib
不同的位置.我不在乎它现在去哪里,但我不打算运行 make install
这可能会覆盖 /usr/lib/libc++.1.dylib
. -stdlib=libc++
事业
clang++
链接硬编码
/usr/lib/libc++.1.dylib
?如果是这样,我可以放弃它吗,
-l<compiled libc++.dylib>
明确的?否则,我如何编译 clang 以修改此路径以使其使用正确的路径?
-stdlib=libc++ -nostdinc++
(见第一个编辑)并祈祷它实际上意味着叮当听
-I<new libc++ header path> -L<new libc++ dylib path>
.我想如果它仍然不起作用并且尽管做出了这些努力,系统文件仍然被使用,只要我的程序继续编译,我仍然会很高兴......
最佳答案
我已经足够满意地回答我自己的问题,所以我将在这里总结我的发现。
这可能不是全貌,但它描绘的足以让我找到我难以找到的信息。
大约在tools/clang/lib/Driver/ToolChains.cpp
的606行附近只是推送 -lc++
的代码到命令参数。这是在 clang 的工具链实现中(它或多或少是让 clang 模拟 gcc 命令行行为的组件的一部分,以便它与构建目的兼容)。
这意味着 libc++.dylib/so 使用与所有其他库完全相同的机制加载进来。 C++ 标准库没有特殊处理。这也意味着它是以半硬编码的方式完成的。也许这不太准确,因为我确实希望显式库路径规范( -L
)可以优先于默认根路径。
无论如何,与其尝试修补 -L
,有一个更大的锤子可以使用,--sysroot
.通过将 libc++ 安装到与系统 /usr/lib
不同的位置, 我可以用 --sysroot
使用 clang 调用强制 clang 甚至不考虑查看 /usr/lib
对于 libc++ 或其他任何东西,就此而言。这是一个有用的标志,例如交叉编译作业。
好的,这些是一些操纵 clang 来执行我们的指令的方法。当然,它们足够强大。现在我需要绝对确定我认为被包含和链接的 libc++ 实际上被包含和链接。
我追求的是万无一失的东西,而不是简单而聪明的东西。我对 libc++ 本身进行了一些战略性编辑,然后将其安装到备用目录中(不是 /usr/lib
——请参阅我的问题,了解为什么我不想弄乱我的系统 libc++):这可能非常随意,我添加
std::libcxx_custom_version_type::libcxx_custom_version_type() {
libcxx_custom_version = "slu_libc++_svn_218071";
}
struct libcxx_custom_version_type {
char* libcxx_custom_version;
libcxx_custom_version_type();
};
slu_libc++_svn_218071
通过使用
strings
在 libc++.dylib 上。测试 c++ 文件中的少量测试代码现在可以轻松显示链接的 libc++ 是否是我刚刚编译的那个。
Undefined symbols for architecture x86_64:
"std::terminate()", referenced from:
___clang_call_terminate in reflect-16fcd7.o
ld: symbol(s) not found for architecture x86_64
关于c++ - 运行从源代码构建的 clang 时,如何指定 libc++ 的位置,或者,有人向我解释 -stdlib=libc++ 的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25920130/
我在 Agda 中处理字符串,并且我有它们的向量。我需要检查给定字符串是否出现在向量中(作为检查变量是否自由或绑定(bind)在表达式中的一部分,在我正在做的 PL 理论 wprk 中)。 我仍在寻找
我正在编译大量使用 srand() 和 rand() 的文件,但不包括 stdlib.h。我知道这是不好的做法,但是由于我无法更改正在编译的文件,因此无法在每个文件中插入必要的 include 语句。
我想在我的 Rails 应用程序中使用 Date::ABBR_MONTHS 常量。我在 http://www.ruby-doc.org/stdlib/ 看到了 Ruby stdlib 文档似乎没有这个
昨天我更新了 Android Studio 版本和 Kotlin 插件版本。 Android Studio 版本:3.1.2 Kotlin 版本:1.2.41 当我使用此配置创建 Android 项目
我是使用 CGAL 库的初学者,在组合 CGAL 后,我尝试在 fedora 上运行一个组合映射示例 qt-creator: #include #include #include #includ
Android Studio 2.3.3; Kotlin 插件:1.1.4; Kotlin 编译器:Kotlin 到 JVM:1.6。 Android Studio > 新建项目 > 在项目操作中配置
我有使用 opengl 和 CGAL 的 c++ qt 项目,但我有以下错误: /usr/include/c++/7/cstdlib:75:15: fatal error: stdlib.h: No
我知道的一件事可能不是真的,那就是 T应该是可复制构造的,即T应该有一个可访问的复制构造函数。 但是,是否还有其他要求,例如copy assignable? 作为补充,我记得 Effective ST
此代码片段主要来自 qsort 的手册页。 int cmp(const void *p1, const void *p2) { char s1 = *(*(char * const *)p1);
在现代 C++ 中,标准库是否提供类型列表模板? int main() { using int_types = type_list; std::cout ::value ::type)
我一直在想,C++ 中的设计决策是否有任何理由不为任何标准库容器提供纯抽象类? 我很欣赏 hash_map 后来来自 stdext 命名空间,但共享一个非常相似的接口(interface)。如果我后来
这个问题在这里已经有了答案: What is the use of _start() in C? (4 个答案) 关闭 6 年前。 采用以下 C 程序: int main(){} 它没有使用 C 标
关注此blog post我试图编译 stdlib.so 以将其他代码与其链接。不幸的是,stdlib.so 本身是一个动态链接的二进制文件: # ldd /usr/local/go/pkg/linux
作为一个 puppet 新手,我有一个问题,包括 stdlib 插件 我想使用 stdlib 的 file_line,因此我尝试包含 stdlib 并调用它 class service_mon {
我正在尝试在我创建的类中使用 stdlib 堆栈,但我在动态创建它时遇到问题。 这是我的头文件“matcher.h”中的相关代码: private: stack opens;
我已经更新了我的一个非常旧的项目(XCODE 4.5.1 baseSDK iOS6)并且由于某种原因我得到了上面的错误。 它只为 iOS5+ 编译但不适用于 iOS 4.3 ? 有什么想法吗? 最佳答
我有一个使用标准库 fopen/fclose 函数实现的文件 IO 接口(interface),它运行良好,直到我们不得不将其更改为同步实现以防止数据丢失(一种情况)。所以我用系统调用(open()/
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How does system() exactly work in linux? 出于好奇,我想知道 sys
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 年前。 Improve
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!