小编Gae*_*eul的帖子

使用setuptools创建一个调用外部C库的cython包

我正在尝试编译,安装和运行我们将调用的包myPackage.它包含一个从库*.pyx中调用函数的文件.目前,当我运行导入包的脚本时,我获得以下错误消息:fftw_set_timelimit()fftwclientScript.py

Traceback (most recent call last):
  File "clientScript.py", line 5, in <module>
    import myPackage.myModule
ImportError: /usr/local/lib/python2.7/dist-packages/myPackage/myModule.so: undefined symbol: fftw_set_timelimit
Run Code Online (Sandbox Code Playgroud)

根据我的理解(我是python和cython的新手),我的包中尚未执行与C库的链接.的确,我的setup.py文件看起来像这样:

from setuptools   import setup,find_packages
from Cython.Build import cythonize
import os

setup(
    name = "myPackage",
    version = "0.0.1",
    url = "none",
    author = "me",
    author_email = "me@me.me",
    packages=find_packages(),
    ext_modules = cythonize("pyClo/pyClo.pyx"),
)
Run Code Online (Sandbox Code Playgroud)

如您所见,我的setup.py文件使用setuptools.我决定这样做,因为它是Python包装用户指南推荐的.但是,使用Cython文档中的说明distutils.链接库是通过调用来完成的distutils.Extension('file',['file.pyx'],libraries='fftw').如何使用相同的结果setuptools

python distutils setuptools cython setup.py

19
推荐指数
1
解决办法
1万
查看次数

为什么`initializer_list <pair>`和`initializer_list <tuple>`表现不一样?

以下代码编译并运行:

#include <initializer_list>
#include <iostream>
#include <vector>
#include <tuple>

void ext( std::initializer_list<std::pair<double, std::vector<double> >> myList )
{
    //Do something
}

///////////////////////////////////////////////////////////

int main(void) {
    ext( { {1.0, {2.0, 3.0, 4.0} } } );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然这个没有:

#include <initializer_list>
#include <iostream>
#include <vector>
#include <tuple>

void ext( std::initializer_list<std::tuple<double, std::vector<double> >> myList )
{
    //Do something
}

///////////////////////////////////////////////////////////

int main(void) {
    ext( { {1.0, {2.0, 3.0, 4.0} } } );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是,在第一种情况下,ext()函数接受类型initializer_list<pair>(工作)的参数而另一个使用initializer_list<tuple>(不起作用).但是,cplusplus.com表示 …

c++ tuples initializer-list std-pair

14
推荐指数
1
解决办法
955
查看次数

lldb:打印变量的地址

我正在尝试使用打印变量的地址lldb.但是,调用print &(myVar)打印变量的内容而不是其地址.

(lldb) print &(myVar)
(const string *) $18 = "hello"
Run Code Online (Sandbox Code Playgroud)

同样的expression &(myVar).

(lldb) expression &(myVar)
(const string *) $19 = "hello"
Run Code Online (Sandbox Code Playgroud)

我也尝试过expression-L选项:

(lldb) expression -L -- &(myVar)
0x00000000021aea80: (const string *) $20 = "hello"

(lldb) expression -L -- myVar
0x0000000002a15430: (std::string) $23 = "hello"
Run Code Online (Sandbox Code Playgroud)

但是每次调用时输出的地址都会改变expression -L.因此我假设它不对应于内存中变量的地址.

如何在内存中获取变量的地址?

(我使用lldb 3.4)

memory-address lldb

11
推荐指数
1
解决办法
5914
查看次数

Lldb:设置条件断点,字符串相等为条件

我想用lldb设置一个条件断点.这通常使用-c选项完成:

breakpoint set -f myFile.cpp -l 123 -c 'a==3'
Run Code Online (Sandbox Code Playgroud)

但是,在我的情况下,我想测试一个std::string对象是否等于某个字符串值但是这样做

breakpoint set -f myFile.cpp -l 123 -c 'a=="hello"'
Run Code Online (Sandbox Code Playgroud)

不起作用... Lldb没有抱怨(虽然gdb会返回错误)但它在到达断点时忽略条件字符串并且过早地中断...

这个问题与类似,但使用lldb而不是gdb.那里提出了解决方案

breakpoint set -f myFile.cpp -l 123 if strcmp(a, "hello")==0
Run Code Online (Sandbox Code Playgroud)

似乎对lldb无效

使用的Lldb版本:3.4

breakpoints conditional-breakpoint lldb

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

使用gdb进行调试时,请彻底退出valgrind

我正在使用valgrind和gdb调试程序.但是,我以野蛮的方式终止这些调试会话......它真的是如何实现的吗?

设置调试会话

按照官方valgrind网站的说明,我执行以下操作来运行该程序:

  1. 我输入了valgrind

    valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从另一个终端会话,我运行gdb使用

    gdb ./prgm.run
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我将gdb连接到valgrind

    (gdb) target remote | vgdb
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我从gdb CLI运行程序

    (gdb) c
    
    Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利:程序在两个终端中运行(用于valgrind的程序和用于gdb的程序).然后valgrind发现错误,例如读取无效,程序执行暂停.

终止会话

那时,我想摆弄我的代码:或许修改一些东西,或者从程序的源代码中注释/取消注释.因此,该程序需要重新编译.生成新的二进制文件.接下来,我想停止正在进行的valgrind和gdb会话(使用旧的二进制文件)并启动将使用新二进制文件的新valgrind和gdb会话.

为了停止正在进行的会话,我退出了gdb

(gdb) q
Run Code Online (Sandbox Code Playgroud)

有时valgrind会注意到gdb不再存在并退出.但其他时候valgrind仍然保持平衡 - 虽然没有gdb进程存在...

在那种情况下,我杀死了与我的valgrind会话相对应的"memcheck-amd64-"进程.该进程的数量在valgrind消息中指示,例如16195in ==16195== Invalid read of size 8).

kill -9 16195
Run Code Online (Sandbox Code Playgroud)

定期杀人是不够的:我需要使用该-9选项.

我不认为调用kill -9它是如何完成的......我错过了什么?

valgrind版本:3.10.1

gdb版本:7.7.1

debugging gdb valgrind terminate

9
推荐指数
1
解决办法
1808
查看次数

为什么它是非法的:将指针的向量复制到指向常量的指针向量中

问题

以下代码不能在C++ 11(也不是C++ 14)中编译.我理解编译器输出的错误,但为什么标准不允许这样做?

//main.cpp

#include <vector>

int main(void)
{
    double a = 3.0;
    double b = 3.0;

    //It works with mere pointers
    const double* ptrToConst = &a;
    /***/ double* ptrToObj   = &a;
//  ptrToObj = ptrToConst; //Illegal : that's understandable…
    ptrToConst = ptrToObj;   //Works

    //But the same doesn't work with vectors to pointers
    std::vector<const double*> ptrsToConst = {&a, &b};
    std::vector</***/ double*> ptrsToObj   = {&a, &b};
//  ptrsToObj = ptrsToConst; //Illegal : that's understandable
    ptrsToConst = ptrsToObj; //Illegal : but …
Run Code Online (Sandbox Code Playgroud)

c++ pointers constants vector c++11

9
推荐指数
1
解决办法
335
查看次数

Octave:如何防止绘图窗口自行关闭?

从八度 CLI 或八度 GUI,如果我运行

plot([1,2,3],[1,4,9])
Run Code Online (Sandbox Code Playgroud)

它将显示一个绘图窗口,我可以查看并与之交互。但是,如果我使用与内容相同的命令创建文件 myPlot.m

plot([1,2,3],[1,4,9])
Run Code Online (Sandbox Code Playgroud)

我运行它

octave myPlot.m
Run Code Online (Sandbox Code Playgroud)

然后我可以短暂地看到绘图窗口出现了几分之一秒并立即关闭。如何防止此窗口自行关闭?

八度 4.2.2 Ubuntu 18.04

plot window octave

9
推荐指数
2
解决办法
3170
查看次数

有一个python构造是一个虚函数吗?

是否有一个python结构对应于一个不带参数的函数,什么也不做,什么都不返回?类似于对象的东西,None但这将是一个函数而不是一个对象?

上下文

我想定义一个类,其中构造函数将函数作为参数获取并将其引用到类属性.在实例化时,用户决定他/她是否希望该功能是他/她定义他/她自己的实际功能,或者保留默认值,即调用不做任何事情的虚拟功能.

这就是我现在拥有的:

def sayHello():
    print("hello world !")

def doNothing():
    pass

class myClass:
    def __init__(self, myFunc):
        self.doIt = myFunc

myInstance = myClass(sayHello)
myInstance.doIt()
myInstance = myClass(doNothing) # Works but requires defining function doNothing()
myInstance.doIt()
#myInstance = myClass(None) # Returns error "'NoneType' object is not callable"
myInstance.doIt()
Run Code Online (Sandbox Code Playgroud)

python function nonetype

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

Boost :: Test:编译并运行"hello world"程序

我正在尝试运行一个虚拟的Boost.test"hello world"程序.我在这里那里找到了文档,但显然有一些我遗漏的东西......

这是我做的:

第一步:我安装了依赖项

sudo aptitude install libboost-test-dev
Run Code Online (Sandbox Code Playgroud)

它安装headers(libboost-test1.54-dev)和二进制文件(libboost-test1.54.0).

步骤#2:创建要编译的源文件

我有一个单独的文件test.cpp,其中包含:

#define BOOST_TEST_MODULE const_string test
#include <boost/test/unit_test.hpp>

// EOF
Run Code Online (Sandbox Code Playgroud)

正如官方教程中所推荐的那样

第3步:编译

我通过调用来编译我的代码:

g++ test.cpp -lboost_unit_test_framework
Run Code Online (Sandbox Code Playgroud)

我不是100%确定链接库的选项,因为官方教程没有明确提及它.然而,它似乎与我所拥有的库文件名相匹配/usr/lib.此外,链接器不会抱怨没有找到共享对象或静态库文件.

返回以下错误:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

问题

我完全赞同链接器:main()我的代码中没有看到任何函数......但是我应该在哪里以及如何实现它?

我很惊讶,因为我期望必须创建一个runner.cpp文件定义函数,main()但官方的提升教程没有提到这样的事情......

这个答案建议定义BOOST_TEST_NO_MAIN宏,但官方的提升教程也没有提到它.这是正确的做法吗?

有人可以给我一些关于如何使我的虚拟"hello world"项目编译的明确分步说明吗?

c++ program-entry-point compiler-errors linker-errors boost-test

5
推荐指数
2
解决办法
2316
查看次数

C++:&(std :: cout)作为模板参数

为什么不能将std::cout地址作为模板参数传递?或者如果有可能那么如何?

这是我尝试过的:

#include <iostream>

template<std::ostream* stream>
class MyClass
{
public:
    void disp(void)
        { (*stream) << "hello"; }
};

int main(void)
{
    MyClass<&(std::cout)> MyObj;
    MyObj.disp();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息clang++ -std=c++11:

main.cpp:15:11: error: non-type template argument does not refer to any declaration
        MyClass<&(std::cout)> MyObj;
                 ^~~~~~~~~~~
main.cpp:6:24: note: template parameter is declared here
template<std::ostream* stream>
                       ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

来自g++ -std=c++11:

main.cpp: In function ‘int main()’:
main.cpp:15:22: error: template argument 1 is invalid
  MyClass<&(std::cout)> MyObj;
                      ^
main.cpp:15:29: …
Run Code Online (Sandbox Code Playgroud)

c++ templates cout c++11

5
推荐指数
2
解决办法
760
查看次数

Pandoc:从 Markdown 输入生成一个 html 嵌入的 Latex 方程

我正在尝试使用 pandoc 将包含 Latex 方程的降价文件转换为 Html 文件。

我在文件中尝试了以下合成器test.md

$$ \frac{1}{2} = 0.5 \neq \sqrt{2} $$
Run Code Online (Sandbox Code Playgroud)

我调用 pandoc 使用

pandoc test.md -o test.html --mathjax
Run Code Online (Sandbox Code Playgroud)

正如这个答案中所指出的那样。生成的test.html文件包含单行

<p><span class="math">\[ \frac{1}{2} = 0.5 \neq \sqrt{2} \]</span></p>
Run Code Online (Sandbox Code Playgroud)

test.html使用网络浏览器打开时,屏幕上的输出有点

\[ \frac{1}{2} = 0.5 \neq \sqrt{2} \]
Run Code Online (Sandbox Code Playgroud)

而不是一个很好的“乳胶编译”方程。

我错过了什么?

PS 我正在使用 pandoc 1.12.2.1

html markdown latex pandoc

4
推荐指数
1
解决办法
1786
查看次数

马克西玛(Maxima):建立和加载库的推荐方法是什么?

我想制作一个小的“库”供将来的maxima脚本使用,但是我不确定如何继续(我使用wxMaxima)。千里马的文档覆盖save()load()loadFile()功能,但不提供的例子。因此,我不确定我是否使用正确/最佳方法。我当前基于帖子的解决方案将我的库以* .lisp格式存储。

举一个简单的例子,假设我的库定义了cosSin(x)函数。我打开一个新会话并将此函数定义为

(%i0) cosSin(x) := cos(x) * sin(x);
Run Code Online (Sandbox Code Playgroud)

然后,将其保存到/tmp/目录中的Lisp文件中。

(%i1) save("/tmp/lib.lisp");
Run Code Online (Sandbox Code Playgroud)

然后,我打开一个新的maxima实例并加载该库

(%i0) loadfile("/tmp/lib.lisp");
Run Code Online (Sandbox Code Playgroud)

cosSin(x)现在定义可以称得上

(%i1) cosSin(%pi/4)

(%o1) 1/2
Run Code Online (Sandbox Code Playgroud)

但是,我注意到maxima附带的大量库都是* .mac格式的:该/usr/share/maxima/5.37.2/share/目录包含428 * .mac文件和516 * .lisp文件。这是更好的格式吗?我将如何生成此类文件?

更一般而言,库的保存和加载方式有哪些不同?推荐的方法是什么?

maxima

4
推荐指数
1
解决办法
1244
查看次数