在查找附加的库之前,如何在本地查找函数/类定义?(链接器 C++)

How to look-up for function/class definitions locally, before looking up the attached libraries? (Linker C++)

提问人:Sreevatsank Kadaveru 提问时间:1/17/2019 更新时间:1/17/2019 访问量:90

问:

我的观察: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)指令较低的优先级,以便链接器首先考虑本地存在的定义,然后再寻找其他地方” 这非常优雅地解决了这个问题。

C++ visual-studio 链接器错误 mathgl

评论

1赞 ThomasMcLeod 1/17/2019
欢迎来到 Stackoverflow。您认为什么是“附属图书馆”与“本地存在”?
0赞 drescherjm 1/17/2019
__declspec(dllimport)表示实现位于 DLL 中,并且您将链接到导入库。
0赞 Sreevatsank Kadaveru 1/17/2019
@ThomasMcLeod“附加库”是我手动附加的预编译“.lib”文件作为附加项,“本地存在的定义”是存在于我正在编译的源文件(即 .cpp/.h 文件中)中的函数定义。例如:
0赞 Sreevatsank Kadaveru 1/17/2019
例如:class FullyDefined_Class{ // 是一个完全定义的类,所有函数都有定义良好的定义。( 本地存在) int a, b, c;some variables int Fully_Defined_Function(){ // 完整函数定义 printf(“完全定义函数示例\n”); return 0; } };class __declspec(dllimport) ExternallyDefined_Class { // 这是一个外部定义的类,这里不存在它的函数定义之一 int a, b, c; int exteranlly_Defined Function(); };
0赞 ThomasMcLeod 1/18/2019
听起来您没有将链接器配置为搜索 .lib 文件。它们是否位于项目树之外?

答: 暂无答案