我在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宏的定义。