我有一个C++项目,它使用我也写过的C++库.我正在使用clang ++ 3.3来构建一切.库中的每个文件都编译为
clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc
Run Code Online (Sandbox Code Playgroud)
然后我使用llvm-link将所有库*.bc文件组合成一个像这样的位代码文件
llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc
Run Code Online (Sandbox Code Playgroud)
我将其概念化为类似于创建目标文件的存档,但我不认为这是基于事物的行为方式.
然后我使用与上面相似的命令编译项目的源文件.然后我使用llvm-link(再次)将这些以及库位代码文件与这样的单个位代码文件组合在一起
llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc
Run Code Online (Sandbox Code Playgroud)
接下来,我将app.bc1编译为本机对象文件
llc -filetype=obj app.bc1 -o app.o
Run Code Online (Sandbox Code Playgroud)
最后我再次使用clang ++链接这个本机对象文件(和我需要的其他本机库,比如C++标准库等)
clang++ app.o -o app
Run Code Online (Sandbox Code Playgroud)
然而,似乎正在发生的事情是,当我链接应用程序的位代码时,MyLibrary.bc的全部内容似乎都包含在结果中.因此,最终链接需要解析我实际上没有使用的库组件所做的引用.
我想要做的是从MyLibrary.bc中提取我的应用程序所需的位代码文件.我看到有一个llvm-ar程序,但在阅读它时,我不会觉得它会有所帮助.我猜我可以将库与llvm-ar结合使用而不是llvm-link,但我无法弄明白.我希望我所需要的只是一点推动:)
我有一个ANTLR3语法,可以构建一个抽象语法树.我正在寻求升级到ANTLR4.但是,似乎ANTLR4只构建解析树而不是抽象语法树.例如,output=AST不再识别该选项.此外,"The Definitive ANTLR4 reference"的文本中既没有出现"AST"也没有出现"抽象语法".
我想知道我是否遗漏了什么.
我的应用程序目前知道如何爬行ANTLR3生成的AST.更改它以处理解析树并非不可能,但这将是一项工作.在我开始走这条路之前,我想确定它是必要的.
我正在尝试使用Scala 2.10反射来查找方法参数的派生类型.例如,考虑这个程序:
import reflect.runtime.universe._
object ReflectionTest {
def checkType[A : TypeTag](item: A) {
println("typeOf[A]: " + typeOf[A])
}
def main(args: Array[String]) {
val a = Array(1, "Hello")
for (item <- a) checkType(item)
}
}
Run Code Online (Sandbox Code Playgroud)
这里a有类型Array [Any]所以每个被发送的项目checkType都有Any类型.结果,checkType产出
typeOf[A]: Any
typeOf[A]: Any
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,因为TypeTag是由编译器在调用时生成的(其中所有知道类型的都是它Any).但是,我想要确定每个项目的实际类型.我想输出一些东西
Int
String
Run Code Online (Sandbox Code Playgroud)
我在这里查看了文档
http://docs.scala-lang.org/overviews/reflection/overview.html
但是样本似乎并没有涵盖这种情况,我发现环境,宇宙和镜子的讨论难以渗透.似乎我想要做的事情应该相当简单,但也许我正在接近它完全错误.
我是 D 编程新手。我在 M1 处理器上使用 macOS Sonoma。我系统上的 clang 版本是 15.0.0。我安装了最新版本的 DMD (2.106)。我创建了这个程序:
import std.stdio;
int main()
{
int a = 0;
a++;
// Display the result.
writefln("a = %d", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用命令编译它dmd app.d,其中“app.d”是包含上述代码的文件的名称。这是我收到的消息:
ld: multiple errors: symbol count from symbol table and dynamic symbol table differ in '/Users/peter/BOK/D/source/app.o' in '/Users/peter/BOK/D/source/app.o'; address=0x0 points to section(2) with no content in '/Library/D/dmd/lib/libphobos2.a[3228](config_a94_4c3.o)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
当我将 -v 选项添加到链接器命令行时,我收到大量这种形式的消息: …