我正在使用这个答案创建一个模块映射来为CommonCrypto创建一个模块,这样我就可以在框架中使用它.
但是,这样做意味着我使用此框架的任何项目都可以访问CommonCrypto import CommonCrypto- 更糟糕的是,在另一个框架中声明CommonCrypto并将其导入项目会导致Redefinition of module 'CommonCrypto'错误.
即以下设置:
MainProject
|--> import FrameworkA - module map for CommonCrypto
|--> import FrameworkB - module map for CommonCrypto
Run Code Online (Sandbox Code Playgroud)
有没有办法创建模块映射,但是它创建/使用的是哪个框架是私有的?(很像internalSwift for Framework中的access属性).该LLVM锵文档显示private属性,但我不能工作在什么地方把这个在我的模块图,它甚至可能不是为了这个目的!还有一个export属性,但我再也不确定如何使用它......!
这是我用于CommonCrypto的模块映射 - $(SDKROOT)在构建阶段将其换出到正确的位置(对于iphoneos或iphonesimulatorSDK):
module CommonCrypto [system] [extern_c] {
umbrella header "$(SDKROOT)/usr/include/CommonCrypto/CommonCrypto.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
这工作正常(除了你不能"去定义"但我不介意)用于FrameworkA/ FrameworkB.
我有一个这样的 C++ 类:
class A {
public:
A() :
m_a(someValue1),
m_b(someValue2),
m_c(someValue3)
{
}
// .... other class members
private:
A m_a;
B m_b;
C m_c;
};
Run Code Online (Sandbox Code Playgroud)
使用 clang-format 格式化此代码后,我得到:
class A {
public:
A() :
m_a(someValue1), m_b(someValue2), m_c(someValue3)
{
}
// .... other class members
private:
A m_a;
B m_b;
C m_c;
};
Run Code Online (Sandbox Code Playgroud)
即构造函数中的初始化列表被格式化为单行,直到达到他们允许的最大行长度。
我的问题是如何告诉 clang-format 将每个元素保留在自己的行上,就像在格式化之前在我的原始代码中一样?我找不到任何合适的参数。我尝试将参数 AllowShortBlocksOnASingleLine(在我看来是最合适的)设置为 true 和 false,但这对此没有影响。那么有人可以建议如何实现这种格式吗?
这是我的 .clang 格式:
BasedOnStyle: Google
AccessModifierOffset: '-4'
AlignAfterOpenBracket: DontAlign
AlignConsecutiveAssignments: 'false'
AlignConsecutiveDeclarations: 'false'
AlignEscapedNewlines: Left
AlignOperands: 'true'
AlignTrailingComments: …Run Code Online (Sandbox Code Playgroud) 基于LLVM官方页面,可以根据我的理解进行安装时优化,首先在分发之前编译到构建机器上的字节码,然后在目标机器上,在安装时将字节码转换为本机代码.
这个功能有没有真实世界的例子?更具体地说,我想知道是否有可能采用任意开源C/C++项目,该项目使用autoconf(即通常由其构建和安装./configure && make && make install),以及
./configure && make以特殊方式运行(例如,设置一些环境变量,甚至修改configure.ac或其他一些autoconf文件),以便它生成可执行文件和库作为字节代码;make install
以特殊方式运行,以便像往常一样安装所有文件,但将字节代码转换为可执行文件和库的本机代码.我从这个网站下载了Clang 3.6.2,并尝试使用Windows下的Code :: Blocks进行设置.不幸的是,由于它不知道在哪里,它无法编译一个简单的"hello world"程序iostream.
查看安装文件夹,它似乎没有包含标准库.为什么?我怎么得到它?
Swift 2有API 可用性检查.
当您使用对于最小目标操作系统来说太新的API时,编译器会给您一个错误
为什么objective-c编译器不能做等效的?
我google了目标c API可用性检查,只有swift 2结果出来,所以我假设目标c的编译器不能这样做.
我按照这个SO答案的说明但是当我尝试运行生成的PTX文件时,我在clBuild中得到了跟随错误
ptxas fatal : Unresolved extern function 'get_group_id'
Run Code Online (Sandbox Code Playgroud)
在PTX文件中,我使用的每个OpenCL函数调用都有以下内容
.func (.param .b64 func_retval0) get_group_id
(
.param .b32 get_group_id_param_0
)
;
Run Code Online (Sandbox Code Playgroud)
当我提供一个CL文件时,OpenCL运行时创建的PTX文件中不存在上述内容.相反,它有适当的特殊寄存器.
遵循这些说明(链接到不同的libclc库)在LLVM IR到PTX编译期间给出了分段错误,并出现以下错误:
fatal error: error in backend: Cannot cast between two non-generic address spaces
Run Code Online (Sandbox Code Playgroud)
这些说明仍然有效吗?还有什么我应该做的吗?
我使用的是最新版本的libclc,Clang 3.7和Nvidia驱动程序352.39
Windows上的Clang/LLVM 7.0.1 每个TU初始化一次内联静态数据成员.据我所知,C++ 17这是不正确的.
尽管可以在多个TU中定义内联变量,但编译器和/或链接器必须确保它在程序中仅存在一次,因此仅初始化一次.就像多重定义的内联函数一样,在程序中只存在一次.请参阅以下小程序:
// header.h
#include <iostream>
struct A
{
A() { std::cout << "ctor " << this << std::endl; }
~A() { std::cout << "dtor " << this << std::endl; }
void f() { std::cout << "f " << this << std::endl; }
};
struct S
{
inline static A a; // C++17 inline variable, thus also a definition
};
Run Code Online (Sandbox Code Playgroud)
// TU1.cpp
#include "header.h"
int main()
{
S::a.f();
}
Run Code Online (Sandbox Code Playgroud)
// TU2.cpp
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
// …
在Clang API中,有GotoStmt和IndirectGotoStmt。关于这两种goto陈述之间的区别,几乎没有解释。我知道这goto label;是什么声明。但是什么是间接goto语句?我想知道C / C ++代码上下文中的含义,而不仅仅是Clang。拥有间接goto语句在语法上意味着什么?您可以提供一个代码示例吗?
编辑:以下问题很有趣。
在键入时,clang --version我们获得了有关它所构建的LLVM版本的信息:
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Run Code Online (Sandbox Code Playgroud)
但是现在使用Xcode 7我们只得到以下内容:
Apple LLVM version 7.0.0 (clang-700.0.72)
Run Code Online (Sandbox Code Playgroud) 我正在将当前使用gcc编译的项目移动到clang,并且有一堆gcc没有生成的警告(-Winconsistent-missing-override).clang-tidy用于修复*.cpp文件中的这些错误,但它不会触及hpp文件,因为在数据库中找不到编译命令(正如我所料).
我正在使用ninja构建项目并ninja -t compdb cc cxx > .build/compile_commands.json生成编译数据库.我试过跑:
clang-tidy-3.6 -p .build/ \
$(find src/ -name *.cpp) \
$(find src/ -name *.hpp) \
--checks=misc-use-override --fix
Run Code Online (Sandbox Code Playgroud)
修复错误.它拒绝触摸头文件抱怨:
Skipping .../src/header/file.hpp. Compile command not found.
Run Code Online (Sandbox Code Playgroud) llvm-clang ×10
c++ ×6
clang ×4
clang++ ×2
llvm ×2
c ×1
c++17 ×1
clang-format ×1
clang-tidy ×1
dylib ×1
frameworks ×1
goto ×1
objective-c ×1
opencl ×1
swift ×1
xcode ×1
xcode7 ×1