我是LLVM编译器和基础架构的新手.我有以下想法.Clang是C/C++的LLVM前端,类似Rustc for Rust编程语言.两者都可以发出LLVM IR代码,并且可以将发出的代码编译为可执行应用程序.
我的问题是可以链接不同的编程语言吗?示例如下 -
/* Code in C */
int add(int, int);
int main()
{
printf("%d", add(5 ,6));
}
Run Code Online (Sandbox Code Playgroud)
以Rust中定义的函数为例
// Code in Rust
fn main()
{
println!("{}", add(5, 6));
}
fn add (x: i32, y: i32) -> i32
{
x + y
}
Run Code Online (Sandbox Code Playgroud)
从两个源文件生成IR后,是否可以链接它们并创建单个应用程序?
我很想知道这是否有效,请告诉我.
Clang Compiler 是基于 LLVM 基础架构构建的,Clang 前端采用 C/C++ 源代码并生成 LLVM-IR,谁来使用优化器和代码生成?
由于优化器传递库要按顺序放置和调用以生成优化代码,那么指定的顺序在哪里,也是谁生成的目标代码?这是 Clang 前端程序的一部分还是有任何其他程序可以进行这种优化和生成?
我正在使用 Cython 为 python 代码导出 C++ API。该应用程序将在 Ubuntu 上执行。项目文件在这里
我正在包装的函数,读取图像的文件名并显示图像。该Show_Img.pyx文件如下所示
import cv2
cdef public void Print_image(char* name):
img = cv2.imread(name)
cv2.imshow("Image", img)
while(True):
if cv2.waitKey(1) & 0xFF == ord('q'):
break
Run Code Online (Sandbox Code Playgroud)
Cython 生成的 c++ 接口如下所示
__PYX_EXTERN_C DL_IMPORT(void) Print_image(char *);
Run Code Online (Sandbox Code Playgroud)
头文件包含在 my 中algo.cpp,它调用如下函数
#include<iostream>
#include<Python.h>
#include"Show_Img.h"
using namespace std;
int main(){
char *name = "face.jpg";
Py_Initialize();
Print_image(name);
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用下面的命令,我也可以编译上面的代码并生成应用程序
g++ algo.cpp `pkg-config --libs --cflags python-2.7` `pkg-config --libs --cflags opencv` -L. -lShow_Img -o algo
Run Code Online (Sandbox Code Playgroud)
库的路径 …
我有cython模块base.pyx和derived.pyx.base.pyx并定义其导入定义base.pxd文件,并在derived.pyx文件中使用cimport.文件放在这里.
在我的Python应用程序中使用cython生成的共享对象时,模块正确导入,但ImportError: No module named 'base'在Cpp应用程序中使用库时总会出现错误.
我还在我的Cpp应用程序中添加了当前路径
PyObject* path = PySys_GetObject("path");
PyObject* result = PyObject_CallMethod(path,"append","(s)",".");
Py_XDECREF(result);
Run Code Online (Sandbox Code Playgroud)
即使这样,应用程序也看不到cython模块.请让我知道这种路径不匹配的原因是什么.
rustc我正在尝试分析前端发出的 LLVM-IR 。该计划是针对特定语言元素发出 IR。是否有这样的元素列表和IR代码模板映射或列表?
编译器足够智能,可以删除发出的 IR 中未使用的函数:除非使用 打印到控制台println!,否则编译器将删除所有使用的函数。
这也不太有效,话虽如此,它x不会在任何地方使用,也不会在x被覆盖时使用。
let x = function();
Run Code Online (Sandbox Code Playgroud)
Rust 中是否有某种限定符,以便发出的 IR 保留所有功能?
我试图在字符串向量中推送一个字符串,如下所示
void Node::set_val(string &val)
{
this->val.push_back(val);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将其称为如下
Obj.set_val("10h;");
Run Code Online (Sandbox Code Playgroud)
我得到以下错误,
error: no matching function for call to 'Node::set_val(const char [5])'
Run Code Online (Sandbox Code Playgroud)
我假设""中的字符串与stringc ++ 中的字符串相同,为什么会出现这样的错误?下面有什么要改变的?
我有一个包含函数指针的向量
typedef bool (*fPtr)();
vector<fPtr> AlgoDB;
Run Code Online (Sandbox Code Playgroud)
我推入向量的函数定义如下
bool SAlgos1::Algo1() {
cout << "Executing Algo1" << endl;
return true;
}
Run Code Online (Sandbox Code Playgroud)
以下语句用于将函数/指针添加到向量
this->AlgoDB.push_back((fPtr) &this->Algo1);
Run Code Online (Sandbox Code Playgroud)
这是传统的 C 风格函数指针用法,我正在尝试使用std::function,其中向量和函数现在修改如下
typedef function<bool()> ffptr;
vector <ffptr> fAlgoDB;
function<bool()> SAlgos1::fAlgo1(){
cout << "Executing FAlgo1";
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是现在每当我使用这样的语句时
this->fAlgoDB.push_back(fAlgo1);或this->fAlgoDB.push_back(&fAlgo1);
(类型转换也无济于事 - this->fAlgoDB.push_back((ffptr) this->fAlgo1);)
我收到一个错误说明
error: taking address of temporary [-fpermissive] 和
error: could not convert 'true' from 'bool' to 'std::function<bool()>' (即使我并没有真正调用该函数)对于每个备用编译。
如何在向量中存储函数或函数指针?编译器试图传达什么?
我有一个C++代码,它包含一个现有的Object,概率如下:
template< typename Object > struct Roll
{
Object object;
double probability;
Roll( Object p, double s )
: object( p )
, probability( s )
{ }
}
Run Code Online (Sandbox Code Playgroud)
稍后,这将在同一个.h文件中定义为:
typedef Roll< Color > RollColor;
Run Code Online (Sandbox Code Playgroud)
有关如何在SWIG中包装带有基本类型的C++结构的说明,但是这个也与模板有关,所以我不知道如何在我的接口文件中正确包装它.你知道我怎么能这样做吗?非常感谢你.
我正在尝试使用Ada进行汽车编程,以利用该语言的安全关键能力.我只看到了(Libre,GNAT编程工作室)开发工具的商业许可证.
有免费的Ada IDE吗?