我正在尝试在我的C++项目中使用ANTLR.我为指定的语法创建了运行ANTLR生成器的目标,并使主要的prjct依赖于它.
ADD_CUSTOM_TARGET(GenerateParser
COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g
-o ${PROJECT_SOURCE_DIR}/src/MyGrammar
)
ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS})
ADD_DEPENDENCIES(MainProject GenerateParser)
Run Code Online (Sandbox Code Playgroud)
问题是每次构建项目时都会运行ANTLR生成器并消耗足够的时间.我怎样才能让它只运行我的语法?或者可能有可能使ANTLR以某种方式仅为过时语法生成解析器.
在Eigen中是否存在使用相对和绝对容差(numpy.allclose)比较矢量(矩阵)的函数?如果其中一个向量非常接近零,则标准isApprox失败.
如何定义方法签名,以便它接受与variadic模板类定义相同数量的参数?例如,如何定义Array类:
template<typename T, int... shape>
class Array
{
public:
T& operator () (???);
};
Run Code Online (Sandbox Code Playgroud)
所以你可以像这样调用它:
Array<int, 3, 4, 5> a;
a(1, 2, 3) = 2;
Run Code Online (Sandbox Code Playgroud) 在我的程序中,我在C++中管理对python对象的引用.即我所有的类都是从Referenced类派生的,它包含指向相应python对象的指针.
class Referenced
{
public:
unsigned use_count() const
{
return selfptr->ob_refcnt;
}
void add_ref() const
{
Py_INCREF(selfptr);
}
void remove_ref() const
{
Py_DECREF(selfptr);
}
PyObject* selfptr;
};
Run Code Online (Sandbox Code Playgroud)
我使用intrusive_ptr来保存从Referenced派生的对象.这使我可以轻松地在C++中保持对所需python对象的引用,并在必要时访问它们.但是当我要从C++中删除python对象时,我的程序崩溃(仅在windows howewer中),即当我调用Py_DECREF(selfptr)时,是否selfptr-> ob_refcnt == 1. 这种方法是否正常?
Upd:我终于找到了程序中的问题.它与对象移除无直接关系.为了检查最初的问题,我已经实现了简单的扩展模块,记住对python对象的引用并按需发布它.就这个:
#include <Python.h>
static PyObject* myObj;
static PyObject* acquirePythonObject(PyObject* self, PyObject* obj)
{
printf("trying to acquire python object %p, refcount = %d\n", obj, obj->ob_refcnt);
myObj = obj;
Py_INCREF(myObj);
printf("reference acquired\n");
return Py_True;
}
static PyObject* freePythonObject(PyObject*, PyObject*)
{
printf("trying to free python object %p, refcount = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用cython将c ++类暴露给python.我在*.pxd文件中编写了他们的定义,并在*.pyx文件中实现了一个包装器.但我试图传递给扩展类型的函数指针.这是简化的例子.
foo.pyx
from c_foo cimport cFoo
cdef class Foo:
cdef cFoo* _impl
Run Code Online (Sandbox Code Playgroud)
c_foo_holder.pxd
cdef extern from "FooHolder.h":
cdef cppclass cFooHolder:
cFooHolder(cFoo* foo)
Run Code Online (Sandbox Code Playgroud)
foo_holder.pyx
from c_foo_holder cimport cFooHolder
from c_foo cimport cFoo
cdef class FooHolder:
cdef cFooHolder* _impl
def __init__(self, foo):
self._impl = new cFooHolder(<cFoo*>(foo._impl)) # error here
Run Code Online (Sandbox Code Playgroud)
但是在最后一行我得到错误" Python对象不能被强制转换为原始类型的指针 ".我还尝试了其他几种方法,但没有任何效果:
# error: 'Foo' is not a type identifier
from foo import Foo
def __init__(self, Foo foo):
self._impl = new cFooHolder(foo._impl)
# error: 'Foo' is not a type identifier
def …Run Code Online (Sandbox Code Playgroud) 假设您正在开发一些支持多种配置的项目(Linux和Windows构建,共享/静态链接,某些功能或没有,等等).要构建所有这些配置,您需要不同版本的第三方组件(使用gcc或msvc构建,共享/静态,具有一些指定的预处理器定义等).因此,最终您最终会遇到管理所有这些配置的问题,不仅适用于您的项目,还适用于您的项目正在使用的所有库.
是否有通用的解决方案/方法/软件来帮助管理单个项目的几种不同配置?
标准:
到目前为止,我已经尝试了几种方法.
在VCS下为每个配置存储预构建的软件包.
优点:项目很小时易于设置(更新工作副本,你很高兴).易于管理(为每个必需的配置构建一次库).错误证明(VCS客户端会通知您有关工作副本的更改).
缺点:不适用于分布式VCS(GIT,Mercurial等).存储库迅速增长,最终简单的"克隆"操作将无法容忍.您最终还会下载许多您并不真正需要的东西(例如,如果您正在使用Linux,那么就是Windows库).如果您正在实施库,那么您的库的用户将通过将其集成到他们的项目中来继承所有这些问题.
存储库源而不是预构建的包.
优点:易于设置.
缺点:添加新库非常痛苦.您需要为每个配置提供构建脚本和源补丁.但这只是冰山一角.你的依赖项有它们自己的依赖项,它们有自己的依赖项等等......你很有可能最终得到类似Gentoo发行版的东西:)
在外部服务器上的某处存储存档或仅包含预构建软件包的文件夹.
优点:解决问题......有点儿.
缺点:设置起来不那么容易(您必须手动复制存档).不太容易管理(您必须手动将每个库添加到服务器).没有变化的历史.不是错误证明,因为很容易忘记在服务器上放东西,或删除有用的东西.
稍微改进的方法:您可以使用集中式VCS(例如,SVN)来存储所有第三方库,它将更容易使用.但是,如果将其用作简单的文件存储,您或者没有集中的更改历史记录,或者如果将其用作子存储库,则会获得包含大量不必要库的大型存储库.
如何在Kivy中以标准numpy/opencv/matplotlib格式显示图像?Kivy使用不同的图像内存布局,我无法弄清楚哪一个.
以下代码完全正常.使用cv2 VideoCapture捕获图像.我认为图像是BGR,数组尺寸是(360,480,3):
ret, image = video_capture.read()
cv2.imshow('image', image)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
尝试使用以下代码显示它会产生混乱的结果:
video_texture = Texture.create(size=image.shape[:2])
video_texture.blit_buffer(image.tostring(), colorfmt='rgb', bufferfmt='ubyte')
# ...
video_panel = self.ids['video_panel']
with video_panel.canvas:
Rectangle(texture=video_texture, pos=video_panel.pos, size=video_panel.size)
Run Code Online (Sandbox Code Playgroud) 我正在使用自定义工具链文件开发嵌入式系统.CMAKE_SYSTEM_NAME设置为"Generic",因此WIN32,UNIX等变量不能用于检查配置项目的操作系统.但是我需要在不同的OS上以不同的方式配置项目.
如何确定执行cmake的操作系统?
使用virtualenv解释器运行脚本(不激活virtualenv)与在激活的virtualenv中运行脚本之间有区别吗?
venv/bin/python some_script.py
Run Code Online (Sandbox Code Playgroud)
与
source venv/bin/activate
python some_script.py
Run Code Online (Sandbox Code Playgroud) 例如,如果我正在做图像预测并且我的网络输出是形状张量,[299, 299, 3]我该如何编写 loss function loss(y_true, y_pred)。我应该期望y_true和y_pred有形状[batch_size, 299, 299, 3]和损失函数的输出为形状的阵列[batch_size]或其他什么东西?