几天以来,我在使用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)
我当然找到了这个问题的解决方案,但我不太懂,也不知道该怎么办.这些是我找到的主题:
有谁可以帮助我吗?
>> 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) 所以每个人都可能知道glibc /lib/libc.so.6
可以在shell中执行,就像普通的可执行文件一样,在这种情况下它可以打印出版本信息并退出.这是通过在.so中定义入口点来完成的.对于某些情况,将其用于其他项目可能会很有趣.不幸的是,您可以通过ld的-e选项设置的低级入口点有点太低级:动态加载器不可用,因此您无法调用任何正确的库函数.因此,glibc通过此入口点中的裸系统调用实现write()系统调用.
我现在的问题是,任何人都可以想到一个很好的方法,如何从该入口点引导一个完整的动态链接器,以便可以访问其他.so的函数?
在Windows中加载共享库时,LoadLibrary()
调用库中的原因DllMain
,以便为每个新进程和线程库附加,以及为每个进程和线程库执行detaaches.
Mac OS X,Linux和其他POSIX兼容的操作系统是否有类似的机制?
正如标题所提到的,我的问题很明显,我详细描述了这个场景.在文件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) 我正在寻找一种直接从内存加载生成的目标代码的方法.
我知道如果我将它写入文件,我可以调用dlopen动态加载其符号并链接它们.然而,考虑到它从内存开始,写入磁盘,然后由dlopen重新加载到内存中,这似乎有点迂回.我想知道是否有某种方法来动态链接存在于内存中的目标代码.据我所知,可能有几种不同的方法来做到这一点:
尽管它永远不会留下记忆,但我还是认为你的记忆位置是一个文件.
找一些其他的系统调用来完成我正在寻找的东西(我认为这不存在).
找到一些动态链接库,它可以直接在内存中链接代码.显然,这个有点难以谷歌,因为"动态链接库"会显示有关如何动态链接库的信息,而不是关于执行动态链接任务的库的信息.
从链接器中提取一些API并在其代码库中创建一个新库.(显然这对我来说是最不可取的选择).
那么这些可能是哪些?可行?你能指出我假设存在的任何事情吗?还有另一种我甚至没想过的方法吗?
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()'处调用?
我想使用函数'dlopen()'在iOS平台上调用动态库,是函数'dlopen()'私有API?
我正在编写一些使用动态共享库作为插件的代码.
我用于构建共享库的命令行如下所示:
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)
谁能告诉我的模块如何回调我的可执行文件,而不必将所有可执行文件的实用程序功能放入另一个共享库中?
我试图使用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) 我正在尝试使用 Postgres 数据库运行 Django 项目。我使用通过 postgressapp 安装的 Postgres 13.4(具有所有当前支持的版本的通用版本)和 python 3.9(在 venv 中)。我在配备 Apple M1 芯片的 Mac、macOS Big Sur 上工作。
\n我遇到了以下众所周知的问题:
\ndjango.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”:
$ 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
(该解决方案标记为主题启动器接受),但也没有成功。
我尝试从 postgresql.org 安装 postgres,然后使用 homebrew 卸载/重新安装 …