我正在尝试编译,安装和运行我们将调用的包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?
以下代码编译并运行:
#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表示 …
我正在尝试使用打印变量的地址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)
我想用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
我正在使用valgrind和gdb调试程序.但是,我以野蛮的方式终止这些调试会话......它真的是如何实现的吗?
按照官方valgrind网站的说明,我执行以下操作来运行该程序:
我输入了valgrind
valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run
Run Code Online (Sandbox Code Playgroud)从另一个终端会话,我运行gdb使用
gdb ./prgm.run
Run Code Online (Sandbox Code Playgroud)我将gdb连接到valgrind
(gdb) target remote | vgdb
Run Code Online (Sandbox Code Playgroud)我从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
以下代码不能在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) 从八度 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
是否有一个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) 我正在尝试运行一个虚拟的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).
我有一个单独的文件test.cpp,其中包含:
#define BOOST_TEST_MODULE const_string test
#include <boost/test/unit_test.hpp>
// EOF
Run Code Online (Sandbox Code Playgroud)
正如官方教程中所推荐的那样
我通过调用来编译我的代码:
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
为什么不能将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) 我正在尝试使用 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
我想制作一个小的“库”供将来的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文件。这是更好的格式吗?我将如何生成此类文件?
更一般而言,库的保存和加载方式有哪些不同?推荐的方法是什么?
c++ ×4
c++11 ×2
lldb ×2
python ×2
boost-test ×1
breakpoints ×1
constants ×1
cout ×1
cython ×1
debugging ×1
distutils ×1
function ×1
gdb ×1
html ×1
latex ×1
markdown ×1
maxima ×1
nonetype ×1
octave ×1
pandoc ×1
plot ×1
pointers ×1
setup.py ×1
setuptools ×1
std-pair ×1
templates ×1
terminate ×1
tuples ×1
valgrind ×1
vector ×1
window ×1