由于错误的导出宏,无法使用第三方静态库

时间:2018-03-11 08:09:39

标签: c++ visual-studio shared-libraries static-libraries

我在Windows上使用开源library。该库编译为共享版本(dll文件)和静态版本。到目前为止,我已经成功使用了共享版本,但现在我想使用静态版本。

问题是预处理器似乎总是为dll-import配置头文件,这会导致链接器错误,因为在相应的静态lib文件中找不到这些函数。在头文件中搜索相关的导出宏定义,我只发现了这一次出现

/* Mark SUNDIALS API functions for export/import
 * When building shared SUNDIALS libraries under Windows, use
 *      #define SUNDIALS_EXPORT __declspec(dllexport)
 * When linking to shared SUNDIALS libraries under Windows, use
 *      #define SUNDIALS_EXPORT __declspec(dllimport)
 * In all other cases (other platforms or static libraries under
 * Windows), the SUNDIALS_EXPORT macro is empty
 */
#ifdef BUILD_SUNDIALS_LIBRARY
#define SUNDIALS_EXPORT __declspec(dllexport)
#else
#define SUNDIALS_EXPORT __declspec(dllimport)
#endif

根据我对上述的解释,SUNDIALS_EXPORT永远不会为空(与注释告诉我们的内容相反),因此静态版本库永远不能成功使用。我通过暂时只用

替换#ifdef块来证实这一点
#define SUNDIALS_EXPORT

因为那时我可以使用静态库和我的代码编译。所以现在我可以引入另一个像#SfialS_USE_STATIC_LIBRARY_VERSION这样的#define来调整上面的预处理器块,但是在更改第三方代码之前我想知道这是不是真的是一个错误,或者我是否可能错过了使用静态的指定机制库。

有趣的是,在静态库的构建过程中也使用了相同的#ifdef块。所以我认为在构建静态库期间必须以某种方式忽略错误的declspec(因为静态库的生成成功)。 我想知道在我自己的项目中使用静态库时是否也可以忽略declspec。

静态和共享构建项目之间的唯一区别似乎是继承的_WINDLL宏的定义。

0 个答案:

没有答案