提问人:Sreevatsank Kadaveru 提问时间:1/17/2019 更新时间:1/17/2019 访问量:90
在查找附加的库之前,如何在本地查找函数/类定义?(链接器 C++)
How to look-up for function/class definitions locally, before looking up the attached libraries? (Linker C++)
问:
我的观察:C++链接器(特别是Visual Studio)过于认真地对待__declspec(dllimport),链接器会查找定义 使用此指令声明的任何类/函数,仅在附加的库中。(忽略本地存在的定义)。 我想给__declspec(dllimport)指令一个较低的优先级,以便链接器首先考虑本地存在的定义,然后再寻找其他地方。可以这样做吗? 它也是特定于 Windows / Visual Studio 的问题吗?如果是这样,是否有解决方法?
我在 Visual Studio 2015 Windows 上尝试使用预编译的 MathGL-v2.4.2 二进制文件时遇到了这个问题。
初始版本给出了许多链接器错误 2019:无法解析的外部符号 __declspec(dllimport) _cdel mglGraph::mglGraph(void)...。等等。
此外,我浏览了库代码,发现每个类和结构定义的形式如下:
class MGL_EXPORT mglGraph {
// some variables and
// Full function definitions
// (also contains some inline functions)
};
其中MGL_EXPORT定义为,
/* in dllexport.h the following is declared */
# ifdef mgl_EXPORTS
/* We are building this library */
# define MGL_EXPORT __declspec(dllexport)
# else
/* We are using this library */
# define MGL_EXPORT __declspec(dllimport)
# endif
另外,我查找了libmgl.dll导出的符号,链接器正在寻找的那些符号不存在(因此链接器自然会给出未解决的符号错误)。
综上所述,结论:链接器忽略类/函数的任何本地定义,并且仅查找使用 __declspec(dllimport) 指令声明的类/函数的附加库的函数定义。
更多证据:通过从完全定义的函数/类的定义中删除MGL_EXPORT,代码编译
现在的问题是:这是特定于平台的问题吗?如果是,是否有解决方法?(因为在删除指令之前仔细检查库中的每个类以确保所有函数都已完全定义MGL_EXPORT这是非常麻烦的)。
“我想给__declspec(dllimport)指令较低的优先级,以便链接器首先考虑本地存在的定义,然后再寻找其他地方” 这非常优雅地解决了这个问题。
答: 暂无答案
评论
__declspec(dllimport)
表示实现位于 DLL 中,并且您将链接到导入库。