小编Dik*_*rAz的帖子

如果指定文件被更改,如何执行CMake目标?

我正在尝试在我的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以某种方式仅为过时语法生成解析器.

antlr cmake

15
推荐指数
2
解决办法
8368
查看次数

如何在Eigen中近似比较向量?

在Eigen中是否存在使用相对和绝对容差(numpy.allclose)比较矢量(矩阵)的函数?如果其中一个向量非常接近零,则标准isApprox失败.

c++ linear-algebra eigen

11
推荐指数
2
解决办法
9482
查看次数

variadic templates与类中相同数量的函数参数

如何定义方法签名,以便它接受与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++ templates variadic-templates c++11

11
推荐指数
2
解决办法
1291
查看次数

从c ++中删除python中分配的对象是否可以?

在我的程序中,我在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)

c++ python api

10
推荐指数
1
解决办法
1699
查看次数

将python对象转换为cython指针

我正在尝试使用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)

cython

8
推荐指数
1
解决办法
6396
查看次数

如何在多配置项目中管理第三方库

假设您正在开发一些支持多种配置的项目(Linux和Windows构建,共享/静态链接,某些功能或没有,等等).要构建所有这些配置,您需要不同版本的第三方组件(使用gcc或msvc构建,共享/静态,具有一些指定的预处理器定义等).因此,最终您最终会遇到管理所有这些配置的问题,不仅适用于您的项目,还适用于您的项目正在使用的所有库.

是否有通用的解决方案/方法/软件来帮助管理单个项目的几种不同配置?

标准:

  • 易于设置,即从头开始构建项目需要花费多少时间?
  • 易于管理,即难以添加新依赖项或删除现有依赖项?
  • 错误证明,即开发人员通过更改依赖关系来打破构建的频率?

到目前为止,我已经尝试了几种方法.

  1. 在VCS下为每个配置存储预构建的软件包.

    优点:项目很小时易于设置(更新工作副本,你很高兴).易于管理(为每个必需的配置构建一次库).错误证明(VCS客户端会通知您有关工作副本的更改).

    缺点:不适用于分布式VCS(GIT,Mercurial等).存储库迅速增长,最终简单的"克隆"操作将无法容忍.您最终还会下载许多您并不真正需要的东西(例如,如果您正在使用Linux,那么就是Windows库).如果您正在实施库,那么您的库的用户将通过将其集成到他们的项目中来继承所有这些问题.

  2. 存储库源而不是预构建的包.

    优点:易于设置.

    缺点:添加新库非常痛苦.您需要为每个配置提供构建脚本和源补丁.但这只是冰山一角.你的依赖项有它们自己的依赖项,它们有自己的依赖项等等......你很有可能最终得到类似Gentoo发行版的东西:)

  3. 在外部服务器上的某处存储存档或仅包含预构建软件包的文件夹.

    优点:解决问题......有点儿.

    缺点:设置起来不那么容易(您必须手动复制存档).不太容易管理(您必须手动将每个库添加到服务器).没有变化的历史.不是错误证明,因为很容易忘记在服务器上放东西,或删除有用的东西.

    稍微改进的方法:您可以使用集中式VCS(例如,SVN)来存储所有第三方库,它将更容易使用.但是,如果将其用作简单的文件存储,您或者没有集中的更改历史记录,或者如果将其用作子存储库,则会获得包含大量不必要库的大型存储库.

c++ version-control

8
推荐指数
1
解决办法
1157
查看次数

在Kivy中显示numpy/opencv/matplotlib图像

如何在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)

python opencv kivy

7
推荐指数
1
解决办法
1650
查看次数

如何在使用CMake进行交叉编译时确定主机操作系统?

我正在使用自定义工具链文件开发嵌入式系统.CMAKE_SYSTEM_NAME设置为"Generic",因此WIN32,UNIX等变量不能用于检查配置项目的操作系统.但是我需要在不同的OS上以不同的方式配置项目.

如何确定执行cmake的操作系统?

cmake

6
推荐指数
1
解决办法
5417
查看次数

没有激活virtualenv的运行脚本

使用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)

python virtualenv

6
推荐指数
2
解决办法
3425
查看次数

keras 中损失函数的输出形状应该是什么?

例如,如果我正在做图像预测并且我的网络输出是形状张量,[299, 299, 3]我该如何编写 loss function loss(y_true, y_pred)。我应该期望y_truey_pred有形状[batch_size, 299, 299, 3]和损失函数的输出为形状的阵列[batch_size]或其他什么东西?

deep-learning keras tensorflow

6
推荐指数
1
解决办法
2668
查看次数