【发布时间】:2016-09-09 07:58:09
【问题描述】:
我有一个适用于 Windows 和 Linux 的共享库(.dll 和 .so)。除了一些用于平台差异的定义外,代码完全相同。 Windows-DLL 工作正常,所有符号都被导出并可供调用者使用。
但在 Linux 下存在一个问题,当试图调用其中一个函数时,调用应用程序以“未找到符号”消息终止。令人惊讶的是,当我查看 .so 文件(使用 Midnight Commander)时,我可以看到相关符号在那里,所以我认为它没有理由失败!
这是一个库定义的示例。
标题:
#ifdef ENV_LINUX
#ifdef MY_EXPORTS
#define MY_API __attribute ((visibility ("default")))
#else
#define MY_API
#endif
#else
#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
#endif
#ifdef __cplusplus
extern "C"
{
#endif
MY_API unsigned char MY_set_connection(const char *address);
#ifdef __cplusplus
};
#endif // __cplusplus
以及实现:
MY_API unsigned char MY_set_connection(const char *address)
{
// some code here
}
所以头文件和C文件中的函数定义是相同的,库是用构建的
CCOMPILER=libtool --mode=compile g++ -Wall -Wno-unused -fPIC -shared -fvisibility=hidden $(DBGFLAGS) -DMY_EXPORTS -D_REENTRANT -DENV_LINUX -I. -I.. $(CFLAGS) $(LFLAGS)
LINK=libtool --mode=link g++ -rpath /usr/lib
所以在我看来,应该没有理由在运行时找不到该符号。任何想法可能是什么原因?
【问题讨论】:
-
你的函数不是装饰了吗?什么给了你
readelf -Ws yourlib.so,或nm -D yourlib.so
标签: c++ c linux shared-libraries libtool