标签: dlopen

MatLab错误:无法打开静态TLS

几天以来,我在使用MATLAB时不断收到同样的错误dlopen.我对MATLAB很新,这就是为什么我不知道该怎么做.谷歌似乎也没有帮助我.当我尝试制作一个特征向量时,我得到了这个:

Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)

在进行乘法时我也得到了这个:

Error using  * 
BLAS loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)

我当然找到了这个问题的解决方案,但我不太懂,也不知道该怎么办.这些是我找到的主题:

  1. 如何使用MATLAB提供的BLAS库?
  2. http://www.mathworks.de/de/help/matlab/matlab_external/calling-lapack-and-blas-functions-from-mex-files.html

有谁可以帮助我吗?

显示此错误的函数调用示例

>> randn(3,3)

ans =

 2.7694    0.7254   -0.2050             
-1.3499   -0.0631   -0.1241             
 3.0349    0.7147    1.4897            

>> eig(ans)

Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)

matlab blas dlopen lapack libraries

81
推荐指数
5
解决办法
6万
查看次数

构建一个也是可执行文件的.so

所以每个人都可能知道glibc /lib/libc.so.6可以在shell中执行,就像普通的可执行文件一样,在这种情况下它可以打印出版本信息并退出.这是通过在.so中定义入口点来完成的.对于某些情况,将其用于其他项目可能会很有趣.不幸的是,您可以通过ld的-e选项设置的低级入口点有点太低级:动态加载器不可用,因此您无法调用任何正确的库函数.因此,glibc通过此入口点中的裸系统调用实现write()系统调用.

我现在的问题是,任何人都可以想到一个很好的方法,如何从该入口点引导一个完整的动态链接器,以便可以访问其他.so的函数?

c linux glibc shared-libraries dlopen

48
推荐指数
2
解决办法
4467
查看次数

加载共享库时自动执行的功能

在Windows中加载共享库时,LoadLibrary()调用库中的原因DllMain,以便为每个新进程和线程库附加,以及为每个进程和线程库执行detaaches.

Mac OS X,Linux和其他POSIX兼容的操作系统是否有类似的机制?

posix d shared-libraries dlopen

42
推荐指数
3
解决办法
4万
查看次数

Linux上的共享库中的多个单例实例

正如标题所提到的,我的问题很明显,我详细描述了这个场景.在文件singleton.h中有一个名为singleton的类,由singleton模式实现,如下所示:

/*
 * singleton.h
 *
 *  Created on: 2011-12-24
 *      Author: bourneli
 */

#ifndef SINGLETON_H_
#define SINGLETON_H_

class singleton
{
private:
    singleton() {num = -1;}
    static singleton* pInstance;
public:
    static singleton& instance()
    {
        if (NULL == pInstance)
        {
            pInstance = new singleton();
        }
        return *pInstance;
    }
public:
    int num;
};

singleton* singleton::pInstance = NULL;

#endif /* SINGLETON_H_ */
Run Code Online (Sandbox Code Playgroud)

然后,有一个名为hello.cpp的插件如下:

#include <iostream>
#include "singleton.h"

extern "C" void hello() {
    std::cout << "singleton.num in hello.so : " << singleton::instance().num << std::endl;
    ++singleton::instance().num; …
Run Code Online (Sandbox Code Playgroud)

c++ singleton dlopen

36
推荐指数
2
解决办法
2万
查看次数

记忆中的d?

我正在寻找一种直接从内存加载生成的目标代码的方法.

我知道如果我将它写入文件,我可以调用dlopen动态加载其符号并链接它们.然而,考虑到它从内存开始,写入磁盘,然后由dlopen重新加载到内存中,这似乎有点迂回.我想知道是否有某种方法来动态链接存在于内存中的目标代码.据我所知,可能有几种不同的方法来做到这一点:

  1. 尽管它永远不会留下记忆,但我还是认为你的记忆位置是一个文件.

  2. 找一些其他的系统调用来完成我正在寻找的东西(我认为这不存在).

  3. 找到一些动态链接库,它可以直接在内存中链接代码.显然,这个有点难以谷歌,因为"动态链接库"会显示有关如何动态链接库的信息,而不是关于执行动态链接任务的库的信息.

  4. 从链接器中提取一些API并在其代码库中创建一个新库.(显然这对我来说是最不可取的选择).

那么这些可能是哪些?可行?你能指出我假设存在的任何事情吗?还有另一种我甚至没想过的方法吗?

c dynamic-linking ld dlopen

28
推荐指数
4
解决办法
8984
查看次数

dlclose()不会调用全局对象的析构函数

plugin1.cpp:

#include <iostream>

static class TestStatic {
public:
  TestStatic() {
     std::cout << "TestStatic create" << std::endl;
  }
  ~TestStatic() {
     std::cout << "TestStatic destroy" << std::endl;
  }
} test_static;
Run Code Online (Sandbox Code Playgroud)

host.cpp

#include <dlfcn.h>
#include <iostream>
int main(int argc,char *argv[]) {
   void* handle = dlopen("./plugin1.so",RTLD_NOW | RTLD_LOCAL );
   dlclose(handle);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

构建和运行:

>g++ -c plugin1.cpp -o plugin1.o -fPIC
>g++ -shared plugin.o -o plugin1.so
>g++ host.cpp -o host -ldl
>./host
>TestStatic create
>Segmentation fault
Run Code Online (Sandbox Code Playgroud)

为什么TestStatic :: ~TestStatic在'exit()'处调用但不在'dlclose()'处调用?

c++ dll gcc atexit dlopen

22
推荐指数
1
解决办法
4595
查看次数

函数'dlopen()'是私有API吗?

我想使用函数'dlopen()'在iOS平台上调用动态库,是函数'dlopen()'私有API?

dynamic-linking dlopen dynamic-library ios

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

使用dlopen加载库时收到"未定义的符号"错误

我正在编写一些使用动态共享库作为插件的代码.

我用于构建共享库的命令行如下所示:

cc -shared -fPIC -o module.so -g -Wall module.c
Run Code Online (Sandbox Code Playgroud)

在模块中,我可以调用已在主可执行文件中加载的任何其他共享库中的函数.

但是,我无法访问可执行文件本身的(导出的)函数(我收到undefined symbol错误).

我的电话dlopen看起来像这样:

void *handle = dlopen(plugin, RTLD_NOW);
Run Code Online (Sandbox Code Playgroud)

谁能告诉我的模块如何回调我的可执行文件,而不必将所有可执行文件的实用程序功能放入另一个共享库中?

shared-libraries dlopen

20
推荐指数
2
解决办法
2万
查看次数

如何正确地将dlsym返回的指针分配给函数指针类型的变量?

我试图使用dlopen()dlsym()在我的代码,并编译它gcc.

这是第一个文件.

/* main.c */

#include <dlfcn.h>

int main()
{
    void *handle = dlopen("./foo.so", RTLD_NOW);

    if (handle) {
        void (*func)() = dlsym(handle, "func");
        func();
    }

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

这是第二个文件.

/* foo.c */

#include <stdio.h>

void func()
{
    printf("hello, world\n");
}
Run Code Online (Sandbox Code Playgroud)

这是我编译和运行代码的方法.

$ gcc -std=c99 -pedantic -Wall -Wextra -shared -fPIC -o foo.so foo.c
$ gcc -std=c99 -pedantic -Wall -Wextra -ldl -o main main.c
main.c: In function ‘main’:
main.c:10:26: warning: ISO C forbids initialization between function …
Run Code Online (Sandbox Code Playgroud)

c pointers dlopen dlsym

20
推荐指数
3
解决办法
5370
查看次数

加载 psycopg2 模块时出错:未加载库:libpq.5.dylib

我正在尝试使用 Postgres 数据库运行 Django 项目。我使用通过 postgressapp 安装的 Postgres 13.4(具有所有当前支持的版本的通用版本)和 python 3.9(在 venv 中)。我在配备 Apple M1 芯片的 Mac、macOS Big Sur 上工作。

\n

我遇到了以下众所周知的问题:

\n
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: dlopen(/Users/mymac/PyCharmProjects/projectname/venv/lib/python3.9/site-packages/psycopg2/_psycopg.cpython-39-darwin.so, 2): Library not loaded: /opt/homebrew/opt/postgresql/lib/libpq.5.dylib\n\xc2\xa0 Referenced from: /Users/mymac/PyCharmProjects/projectname/venv/lib/python3.9/site-packages/psycopg2/_psycopg.cpython-39-darwin.so\n\xc2\xa0 Reason: image not found\n
Run Code Online (Sandbox Code Playgroud)\n

通过搜索,我发现了一些这样的讨论:https://github.com/psycopg/psycopg2/issues/1216。看来最相关的解决方案是“RyanDurk\xc2\xa0commented\xc2\xa0on Jan 27”:

\n
$ brew install libpq --build-from-source\n\n$ export LDFLAGS="-L/opt/homebrew/opt/libpq/lib"\n\n$ pip install psycopg2\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,就我而言,它没有帮助。

\n

然后,我在这里找到了一些建议:Library not returned: /usr/local/lib/libpq.5.4.dylib并尝试了它们。特别是,我尝试通过符号链接访问 libpq.5.dylib,例如:\nln -s\xc2\xa0 /Library/PostgreSQL/13/lib/libpq.5.dylib /opt/homebrew/opt/postgresql/lib/libpq.5.dylib(该解决方案标记为主题启动器接受),但也没有成功。

\n

我尝试从 postgresql.org 安装 postgres,然后使用 homebrew 卸载/重新安装 …

django postgresql dlopen libpq apple-m1

18
推荐指数
1
解决办法
7137
查看次数