我试图在这个Debian lenny系统上将应用程序与g ++链接起来.ld抱怨它无法找到指定的库.这里的具体示例是ImageMagick,但我也遇到了类似的问题.
我正在调用链接器:
g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic
Run Code Online (Sandbox Code Playgroud)
ld抱怨:
/usr/bin/ld: cannot find -lmagic
Run Code Online (Sandbox Code Playgroud)
然而,libmagic存在:
$ locate libmagic.so
/usr/lib/libmagic.so.1
/usr/lib/libmagic.so.1.0.0
$ ls -all /usr/lib/libmagic.so.1*
lrwxrwxrwx 1 root root 17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
$ ldd /usr/lib/libmagic.so.1.0.0
linux-gate.so.1 => (0xb7f85000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
/lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
libmagic.so.1 -> libmagic.so.1.0.0
Run Code Online (Sandbox Code Playgroud)
我如何进一步诊断这个问题,哪些可能是错的?我做的事情完全是愚蠢的吗?
我想了解一些装配.
汇编如下,我对该testl
行感兴趣:
000319df 8b4508 movl 0x08(%ebp), %eax
000319e2 8b4004 movl 0x04(%eax), %eax
000319e5 85c0 testl %eax, %eax
000319e7 7407 je 0x000319f0
Run Code Online (Sandbox Code Playgroud)
我想了解的那点testl
之间的%eax
和%eax
?我认为这段代码的具体内容并不重要,我只是试图用自己来理解测试 - 这种价值总是不正确吗?
我正在用C++做一些性能关键的工作,我们目前正在使用整数计算来解决本质上浮点的问题,因为"它更快".这会导致很多令人烦恼的问题,并增加了许多烦人的代码.
现在,我记得在大约386天的时间里读到关于浮点计算如此缓慢的情况,我相信(IIRC)有一个可选的共同进程.但是现在肯定会有指数级更复杂和更强大的CPU,如果进行浮点或整数计算,它在"速度"上没有区别吗?特别是因为与导致管道停滞或从主存储器中取出某些东西相比,实际计算时间很短?
我知道正确的答案是在目标硬件上进行基准测试,测试它的好方法是什么?我编写了两个很小的C++程序,并将它们的运行时间与Linux上的"时间"进行了比较,但实际的运行时间变化太大(无法帮助我在虚拟服务器上运行).没有花一整天的时间来运行数百个基准测试,制作图表等等,我可以做些什么来合理地测试相对速度?任何想法或想法?我完全错了吗?
我使用的程序如下,它们不相同:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
int accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += rand( ) % 365;
}
std::cout << accum << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
计划2:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
float accum = 0;
srand( time( NULL …
Run Code Online (Sandbox Code Playgroud) 我使用Go代码连接到TCP/IP服务器,类似于:
conn, err := net.Dial("tcp", host+":"+strconv.Itoa(port))
Run Code Online (Sandbox Code Playgroud)
现在我需要使用带有io.ByteReader的binary.ReadVariant,所以尝试编写如下代码:
var length int64
var err error
length, err = binary.ReadVarint(conn)
Run Code Online (Sandbox Code Playgroud)
给我一个错误,如:
./main.go:67: cannot use conn (type net.Conn) as type io.ByteReader in function argument:
net.Conn does not implement io.ByteReader (missing ReadByte method)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我有一个大型 Rails 应用程序,我希望提高(令人沮丧的)性能。
使用 ruby-prof 运行对我没有多大帮助,我得到与此类似的输出(在瘦的生产模式下运行):
Thread ID: 9322800
Total: 1.607768
Sort by: self_time
%self total self wait child calls name
26.03 0.42 0.42 0.00 0.00 1657 Module#define_method
8.03 0.13 0.13 0.00 0.00 267 Set#initialize
4.41 0.07 0.07 0.00 0.00 44 PG::Result#values
4.28 0.07 0.07 0.00 0.00 1926 ActiveSupport::Callbacks::Callback#start
4.21 0.07 0.07 0.00 0.00 14835 Kernel#hash
4.13 0.08 0.07 0.00 0.01 469 Module#redefine_method
4.11 0.07 0.07 0.00 0.00 63 *<Class::ActiveRecord::Base>#with_scope
4.02 0.07 0.06 0.00 0.00 774 ActiveSupport::Callbacks::Callback#_compile_options
3.24 0.05 0.05 …
Run Code Online (Sandbox Code Playgroud) 我在跨平台C++中工作,并且有一些像这样定义的类:(本例中大大简化了)
class ExampleBase
{
public:
ExampleBase( int blah ) : blah_test(blah) { }
virtual void DoSomething( ) = 0;
private:
int blah_test;
};
class ExampleImplementer : public ExampleBase
{
public:
ExampleImplementer( ) : ExampleBase( 5 ) { }
virtual void DoSomething( ) { /* unique implementation here */ }
};
Run Code Online (Sandbox Code Playgroud)
最初我只有一个类,我在std :: vector中存储了一堆实例,并通过const引用传递.但是现在我需要一个基类(我想保持纯虚拟)和一些多态实现类.
拥有任何实现实例的集合的最佳方法是什么,并且仍然具有无泄漏的简单内存管理,例如堆栈分配了std :: vector?
显然我现在不能有std :: vector <ExampleBase>,因为std :: vector要求类是非纯虚拟的(因为它进行内部分配/复制等).我不希望我的代码的用户意外地创建ExampleBase的实例,因为这是错误的.我也希望避免任何物体切片或任何其他恶意的可能性.
一个阵列std::auto_ptr
会做这个工作,但后来我必须处理初始化它们,寻找一个"免费插槽",没有迭代器等.所有这一轮重新发明似乎有点疯狂.
boost::ptr_vector
看起来很有前途,但它的行为有点奇怪,因为在Linux上构建它需要ExampleBase是非纯虚拟的 - 我不明白为什么......所以boost::ptr_vector
出来了.
这似乎是一个简单的,可能是非常常见的情况.那么最好的方法是什么?我对任何其他标准或提升方式持开放态度:以"最佳"为准.
c++ ×2
x86 ×2
assembly ×1
gcc ×1
go ×1
instructions ×1
linker ×1
linux ×1
polymorphism ×1
profiling ×1
pure-virtual ×1
ruby ×1
x86-64 ×1