如何在Visual Studio中静态链接FreeType2?

时间:2018-01-28 18:23:22

标签: c++ c visual-studio static-linking freetype2

我通过选择 Debug Multithreaded / SingleThreaded 配置,将VS2017中的源Freetype 2.9构建到静态库中。看起来,静态库放在 freetype-2.9 \ _ objs \ x64 \ Debug Static \ freetype.lib 中。

在VS2017中,在其他库目录中,我添加了 freetype-2.9 \ objs \ x64 \ Debug Static 。 在附加依赖项中,我添加了 freetype.lib 。并将运行时库设置为 MTd 。 但是,编译会引发链接器错误:

1>------ Build started: Project: HelloFreetype, Configuration: Debug x64 ------
1>Source.cpp
1>Source.obj : error LNK2019: unresolved external symbol __imp_FT_Init_FreeType referenced in function main
1>Source.obj : error LNK2019: unresolved external symbol __imp_FT_Done_FreeType referenced in function main
1>C:\Users\joaqo\Documents\HelloFreetype\x64\Debug\HelloFreetype.exe : fatal error LNK1120: 2 unresolved externals
1>Done building project "HelloFreetype.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Freetype对预处理器有不寻常的用途,所以这里也是代码:

#include <ft2build.h>
#include FT_FREETYPE_H

int main(int argc, char **argv)
{
    FT_Library  library;
    int error = FT_Init_FreeType(&library);
    if (error) {
        printf("FreeType: Initilization error\n");
        exit(EXIT_FAILURE);
    }
    FT_Done_FreeType(library);
    exit(EXIT_SUCCESS);
}

x86平台发布相同的错误,发布配置和/或将Windows SDK重新定位到8.1(Freetype也是使用SDK 8.1构建的)。使用Freetype 2.7.1也没有成功。并尝试链接到动态库是没有问题的!

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我相信在FreeType 2.9中导致此问题的原因是由于对ftconfig.h中FT_EXPORT的定义的更改。

// From ftconfig.h - FreeType 2.9
#ifndef FT_EXPORT
    #ifdef __cplusplus
    #define FT_EXPORT( x )  extern "C"  x
    #else
    #define FT_EXPORT( x )  extern  x
    #endif

    #ifdef _MSC_VER
        #undef FT_EXPORT
        #ifdef _DLL
        #define FT_EXPORT( x )  __declspec( dllexport )  x
        #else
        #define FT_EXPORT( x )  __declspec( dllimport )  x
        #endif
    #endif
#endif /* !FT_EXPORT */

注意_MSC_VER部分将如何撤消前面的定义。 FreeType的早期版本中不存在此_MSC_VER块。

如果您只想构建静态库(没有DLL),则删除_MSC_VER部分,如下所示:

#ifndef FT_EXPORT
    #ifdef __cplusplus
    #define FT_EXPORT( x )  extern "C"  x
    #else
    #define FT_EXPORT( x )  extern  x
    #endif
#endif /* !FT_EXPORT */