【问题标题】:Making sure same configuration is used for library and executable确保库和可执行文件使用相同的配置
【发布时间】:2011-01-31 11:57:53
【问题描述】:

假设我将一个库作为二进制文件分发。它有两个版本,调试和发布。调试和发布彼此不兼容,所以如果例如用户构建发布可执行文件,他/她必须与发布库链接。

如果库版本和可执行版本之间存在不匹配,目前会出现一些很难发现的细微错误。相反,我想显示一条非常清晰的错误消息,通知存在不匹配,最好是在链接时。

什么是实现这一目标的好方法?

【问题讨论】:

    标签: c++ c versioning


    【解决方案1】:

    我将假设您使用的是静态库,二进制是指将在编译时链接的 .lib(而不是在运行时可能不匹配的 dll 等)。

    在我看来,最简单的方法是在你的 .h 文件中加入这种结构

    #ifdef _RELEASE //or whatever your compiler uses
    #define InitialiseLibrary InitialiseLibraryRelease
    #else
    #define InitialiseLibrary InitialiseLibraryDebug
    #endif
    

    类似在库的cpp文件中:

    #ifdef _RELEASE //or whatever your compiler uses
    void InitialiseLibraryRelease() 
    {
      CommonInitialise();
    }
    #else
    void InitialiseLibraryDebug() 
    {
      CommonInitialise();
    }
    #endif
    

    现在在使用该库的主 exe 中:

    InitialiseLibrary();
    

    如果库和 exe 的版本不匹配,则链接器将报告不匹配一个或其他 InitialiseLibrary... 函数。

    另一种选择是确保发布和调试库编译为不同命名的文件,然后使用 .h 文件中的#pragma 使链接正常工作(与在项目中显式包含库相反)。 使用上面的#ifdef,您可以在编译时通过选择使用哪个#pragma 来选择要链接的库。第二种技术并不能完全解决您的问题(因为如果程序员试图强制它,它不会停止链接的发生)但它是处理此类困难的正常方式(并且在复杂的构建环境中具有优势)

    【讨论】:

      【解决方案2】:

      还可以对安装脚本中的二进制文件/库进行校验和。不过,答案不是 C。

      【讨论】:

        【解决方案3】:

        使用#error 指令,这将中止编译:

        #ifndef RELEASE_VERSION
        #error Release version required
        #endif 
        

        【讨论】:

        • -1 提问者希望库和可执行文件匹配 - 他不想被编译发布。
        • @Elemental: "如果例如用户构建了一个发布可执行文件" - 预处理器魔法并没有超出想象!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-06
        • 1970-01-01
        相关资源
        最近更新 更多