dlopen问题(OSX)

5
我有一个主应用程序,动态加载了一个dylib,我想从这个dylib中调用我的主程序导出的函数。我使用dlopen(NULL,flag)获取我的主应用程序handle,并使用dlsym(handle, symbol)来获取functiondlopen没有错误,但当我尝试dlsym我的function时,我会收到以下error
dlerror dlsym(RTLD_NEXT, CallMe): symbol not found

符号已经通过nm进行了校正确认。我不确定为什么会有 RTLD_NEXT ?这是由于dlopen(NULL,flag)的结果吗?
如何解决这个问题或实现我的目标?
还有其他方法可以调用主应用程序(最好不要通过将函数指针传递给dylib)吗?
提前致谢!
补充:
导出:
extern "C" {
    void CallMe(char* test);    
}
__attribute__((visibility("default")))
void CallMe(char* test)
{
    NSLog(@"CallMe with: %s",test);
}

nm 的结果

...
0000000000001922 T _CallMe
..

dylib 中的代码:

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");

看起来很奇怪,你在那里使用了 RTLD_NEXT。你能发布你的实际代码(包括 flag)吗? - Mat
同时发布在 dylib 上使用的 nm 和 strings 实用程序的输出。 - RLT
希望这可以帮到你:http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html 这是我学习使用共享库所需的所有知识。我也用Mac OS。我在Linux上编写的程序可以运行,但我不知道为什么,请不要问我,第一次运行时可以,第二次和之后就不行了。检查文件结尾和内部文件类型,而不仅仅是结尾。获取有关Mac“ .bundle”文件的一些信息,并担心它们的使用方式有多奇怪。还要获取有关在Mac中加载通常的“.so”文件的信息,这是非常不寻常的活动!我的字符用完了。祝好运,希望你做得更好:D - imacake
不妨尝试在动态库中只使用这个:m_function = (CallMe *)dlsym(RTLD_DEFAULT, "CallMe"); - trojanfoe
与 RTLD_DEFAULT 相同的结果 - Johan_
1个回答

5
我认为更好的方法是与动态库建立一个专有的协议,在初始化时通过传递函数指针结构体来实现。动态库只需提供一些形如init(const struct *myfuncs)的函数,这样就更容易实现动态库。
这样也能使实现更具可移植性。

为什么这会是更好的方法呢?它不会使它更加可移植,或者我太过于Linux化了吗?(算了,我看不懂) - imacake
这是更好的方法,因为您不需要让动态库自己搜索函数;主应用程序以易于使用的方式呈现它们。这更具可移植性,因为您不必使用系统调用来进行搜索;而是使用简单的C语言方法。 - trojanfoe
这是一个选项,但它是一个跨平台库,Windows 版本通过 OS 特定的类解决了 GetModuleHandle(NULL) 的问题,所以我的初始计划是在 OSX 特定的类中实现相同的策略。但如果这个问题不能得到解决,我一定会选择函数结构初始化选项。谢谢! - Johan_
我其实在自己的程序中使用这个(抱歉 @trojanfoe)。在那里,我可以模拟多个“父”应用程序(因为我有一个已加载库的TREE,主要的库会照顾它的子项)。简而言之:这更加灵活。很不错的方法。但是如果现在init函数想要依赖于另一个库并加载它,则该库依赖于刚才的内容,它们将一遍又一遍地加载。那就是程序员的错了。非常酷的方法。(--> _按合同设计_) - imacake
1
你所说的“那种方法”并不清楚。你是在回答我还是@Johan_? - trojanfoe
你的,Torjan。很抱歉。Johan在那里提交了一些方法吗?虽然我说我也看不懂上面的内容。 - imacake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接