dlopen没有找到ldconfig -p找到的库

时间:2015-12-07 20:05:59

标签: c shared-libraries

我正在尝试绑定共享的CUDA库。作为快速验证,我写了以下代码:

var path = require('path');
var progress = require('progress-stream');
var fs = require('fs');
var _source = path.resolve('../inc/big.avi');// 1.5GB
var _target= '/tmp/a.avi';

var stat = fs.statSync(_source);
var str = progress({
    length: stat.size,
    time: 100
});

str.on('progress', function(progress) {
    console.log(progress.percentage);
});

function copyFile(source, target, cb) {
    var cbCalled = false;


    var rd = fs.createReadStream(source);
    rd.on("error", function(err) {
        done(err);
    });

    var wr = fs.createWriteStream(target);

    wr.on("error", function(err) {
        done(err);
    });

    wr.on("close", function(ex) {
        done();
    });

    rd.pipe(str).pipe(wr);

    function done(err) {
        if (!cbCalled) {
            console.log('done');
            cb && cb(err);
            cbCalled = true;
        }
    }
}
copyFile(_source,_target);

此操作因#include <stdlib.h> #include <stdio.h> #include <dlfcn.h> int main(int argc, char **argv) { void *handle; handle = dlopen ("libcuda.so", RTLD_LAZY); if (!handle) { fputs (dlerror(), stderr); exit(1); } dlclose(handle); }

而失败

但是,如果我检查ldconfig,我会得到:

libcuda.so: cannot open shared object file: No such file or directory.

所以似乎ldconfig -p | grep libcuda libcuda.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcuda.so.1 libcuda.so.1 (libc6) => /usr/lib/i386-linux-gnu/libcuda.so.1 libcuda.so (libc6) => /usr/lib/i386-linux-gnu/libcuda.so 确实存在并且被系统看到。那么为什么libcuda.so失败了?

这是在Ubuntu 14.04上。

1 个答案:

答案 0 :(得分:1)

我可以从你的ldconfig -p看到libcuda.so.1 x86_64没有符号链接,你只需要创建它,试试

sudo ln -svf /usr/lib/x86_64-linux-gnu/libcuda.so{.1,}

可能是您没有安装-dev软件包。

或者只是改变

handle = dlopen ("libcuda.so", RTLD_LAZY);

handle = dlopen ("libcuda.so.1", RTLD_LAZY);

但第一种解决方案更好,因为当您使用libcuda.so.1动态链接到-lcuda时,符号链接必须是强制性的。