Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 公开发行(OSX)_C_Macos_Dlopen_Dlsym - Fatal编程技术网

C 公开发行(OSX)

C 公开发行(OSX),c,macos,dlopen,dlsym,C,Macos,Dlopen,Dlsym,我有一个主应用程序,它动态加载dylib,我想从主程序调用导出的函数。我正在使用dlopen(NULL,flag)来handle和dlsym(handle,symbol)来获取函数 dlopen没有错误但是当我尝试dlsym我的函数时,我得到以下错误: dlerror dlsym(RTLD_NEXT, CallMe): symbol not found 该符号被导出,并由确认 我不知道为什么会有下一个?这是否是dlopen(NULL,flag)的结果 我如何解决这个问题或实现我的目标 或者是否

我有一个主应用程序,它动态加载
dylib
,我想从主程序调用导出的函数。我正在使用
dlopen(NULL,flag)
handle
dlsym(handle,symbol)
来获取
函数

dlopen
没有错误
但是当我尝试
dlsym
我的
函数
时,我得到以下
错误

dlerror dlsym(RTLD_NEXT, CallMe): symbol not found
该符号被导出,并由确认 我不知道为什么会有下一个?这是否是dlopen(NULL,flag)的结果

我如何解决这个问题或实现我的目标

或者是否有其他方法调用主应用程序(最好不要将函数指针传递给动态库)

提前谢谢

添加:

出口:

extern "C" {
    void CallMe(char* test);    
}
__attribute__((visibility("default")))
void CallMe(char* test)
{
    NSLog(@"CallMe with: %s",test);
}
nm的结果

...
0000000000001922 T _CallMe
..
动态库中的代码:

void * m_Handle;
typedef void CallMe(char* test);
CallMe* m_Function;

m_Handle = dlopen(NULL,RTLD_LAZY); //Also tried RTLD_NOW|RTLD_GLOBAL

if(!m_Handle)
    return EC_ERROR;

m_Function = (CallMe*)dlsym(m_Handle, "CallMe");
if(!m_Function)
    return EC_ERROR;

m_Function("Hallo");

我认为一个更好的方法可能是使用动态库建立一个专有协议,通过传递函数指针的结构来初始化它。动态库只需提供某种类型的
init(const struct*myfuncs)
,或者类似的函数,这使得实现动态库变得更简单


这也会使实现更具可移植性。

似乎很奇怪,您有
RTLD\u NEXT
。你能发布你的实际代码(包括
标志
s)吗?也可以发布在dylib上使用的nm和strings实用程序的输出。这可以帮助我希望:在这里我学到了使用共享libs所需的一切。一、 我也有苹果操作系统。我在linux上写的一个程序成功了,不知道为什么,请不要问我,我第一次运行它,第二次和其余时间都没有。检查文件结尾和内部文件类型,而不仅仅是结尾。获取一些关于Mac
.bundle
文件的信息,并担心它们的使用有多奇怪。还可以获取有关在mac中加载普通.so文件的信息,这是一项非常不寻常的活动!我的炭用完了。Guud luck希望您做得更好:如何在动态库中尝试这一点:
m_function=(CallMe*)dlsym(RTLD_默认值,“CallMe”)?与RTLD_default的结果相同为什么这是一种更好的方法?无论如何,这不会使它更便于携带,或者我是不是太过分了?(没关系,我看不懂)这是一个更好的方法,因为您没有对函数本身进行动态库搜索;主应用程序以易于使用的方式显示它们。它更便于携带,因为您不必使用系统调用来进行搜索;您使用的是简单的C语言方法。这是一个选项,但它是一个跨平台库,windows版本解决了操作系统特定类中GetModuleHandle(NULL)的问题,因此我最初的计划是在OSX特定类中实现相同的策略。但是如果这个问题不能解决,我肯定会选择函数结构初始化选项。非常感谢。我实际上在我自己的程序中使用了它(抱歉@trojanfoe)。在那里,我可以模拟多个“父”应用程序(因为我加载了一个库树,一个主库负责它的学生)。简而言之:它更灵活。好办法。但是如果现在init函数想要依赖于其他库并加载它,那么这个库就依赖于之前的东西,它们会一次又一次地加载。那是程序员的错。非常酷的方法。(->按合同设计)不清楚这种方法是什么意思。你是在回答我还是“约翰”?