美文网首页
Mac OS X上编译mockcpp过程

Mac OS X上编译mockcpp过程

作者: typesafe | 来源:发表于2019-05-19 16:47 被阅读0次

    Mac OS X上编译mockcpp过程

    OS版本:

    banxia:mockcpp yangjia$ sw_vers
    ProductName:    Mac OS X
    ProductVersion: 10.14
    BuildVersion:   18A391
    

    mockcpp支持cmake,编译步骤如下:

    cd mockcpp/mockcpp
    cmake .
    make
    

    第一次编译错误

    用上面的方法编译到InterfaceInfo.cpp时报错:

    /Users/yangjia/repos/mockcpp/mockcpp/src/InterfaceInfo.cpp:17:12: error: 
          unknown type name '__class_type_info'
         const __class_type_info* info, unsigned int number);
               ^
    /Users/yangjia/repos/mockcpp/mockcpp/src/InterfaceInfo.cpp:21:43: error: 
          unknown type name '__base_class_type_info'
    getNumberOfVtblsByBaseClassTypeInfo(const __base_class_type_info& info
    
    /Users/yangjia/repos/mockcpp/mockcpp/src/InterfaceInfo.cpp:41:29: error: 
          unknown type name '__vmi_class_type_info'
    getNumberOfVtblsByVmi(const __vmi_class_type_info* vmi, unsigned int number)
    

    难道编译器不支持rtti
    设置cmake的选项CMAKE_VERBOSE_MAKEFILE,让cmake输出编译的详细信息:

    set(CMAKE_VERBOSE_MAKEFILE ON)
    

    注意:需要在mockcpp/mockcpp/CMakeLists.txtmockcpp/mockcpp/src/CMakeLists.txt两个文件都增加这个选项才能生效。
    编译输出为:

    [ 10%] Building CXX object src/CMakeFiles/mockcpp.dir/InterfaceInfo.cpp.o
    cd /Users/yangjia/repos/mockcpp/mockcpp/src && /Library/Developer/CommandLineTools/usr/bin/c++  -DMOCKCPP_ALLOW_MULTI_INHERITANCE=1 -DMOCKCPP_MAX_INHERITANCE=2 -DMOCKCPP_MAX_PARAMETERS=12 -DMOCKCPP_MAX_VTBL_SIZE=20 -DMOCKCPP_NO_NAMESPACE=0 -DPACKAGE=\"mockcpp\" -DPACKAGE_BUGREPORT=\"dev.mockcpp@gmail.com\" -DPACKAGE_NAME=\"mockcpp\" -DPACKAGE_STRING=\"mockcpp\" -DPACKAGE_URL=\"http://code.google.com/p/mockcpp\" -DVERSION=\"2.6\" -I/Users/yangjia/repos/mockcpp/mockcpp/3rdparty -I/Users/yangjia/repos/mockcpp/mockcpp/include  -fPIC -o CMakeFiles/mockcpp.dir/InterfaceInfo.cpp.o -c /Users/yangjia/repos/mockcpp/mockcpp/src/InterfaceInfo.cpp
    

    原来用的是xcode自带的clang

    $ /Library/Developer/CommandLineTools/usr/bin/c++ -v
    Apple LLVM version 10.0.0 (clang-1000.10.44.4)
    Target: x86_64-apple-darwin18.0.0
    Thread model: posix
    InstalledDir: /Library/Developer/CommandLineTools/usr/bin
    

    果断换成gcc,设置cmake的选项CMAKE_CXX_COMPILER(mockcpp/mockcpp/src/CMakeLists.txt设置即可):
    正好用homebrew装了一个7.3.0版本的gcc,就用这个版本了:

    SET(CMAKE_CXX_COMPILER /usr/local/bin/g++-7)
    

    第二次编译错误

    编译器换成g++后又报错了:

    [ 10%] Building CXX object src/CMakeFiles/mockcpp.dir/AfterMatcher.cpp.o
    cd /Users/yangjia/repos/mockcpp/mockcpp/src && /usr/local/bin/g++-7  -DMOCKCPP_ALLOW_MULTI_INHERITANCE=1 -DMOCKCPP_MAX_INHERITANCE=2 -DMOCKCPP_MAX_PARAMETERS=12 -DMOCKCPP_MAX_VTBL_SIZE=20 -DMOCKCPP_NO_NAMESPACE=0 -DPACKAGE=\"mockcpp\" -DPACKAGE_BUGREPORT=\"dev.mockcpp@gmail.com\" -DPACKAGE_NAME=\"mockcpp\" -DPACKAGE_STRING=\"mockcpp\" -DPACKAGE_URL=\"http://code.google.com/p/mockcpp\" -DVERSION=\"2.6\" -I/Users/yangjia/repos/mockcpp/mockcpp/3rdparty -I/Users/yangjia/repos/mockcpp/mockcpp/include  -fPIC -o CMakeFiles/mockcpp.dir/AfterMatcher.cpp.o -c /Users/yangjia/repos/mockcpp/mockcpp/src/AfterMatcher.cpp
    In file included from /Users/yangjia/repos/mockcpp/mockcpp/include/mockcpp/AfterMatcher.h:24:0,
                     from /Users/yangjia/repos/mockcpp/mockcpp/src/AfterMatcher.cpp:19:
    /Users/yangjia/repos/mockcpp/mockcpp/include/mockcpp/mockcpp.h:60:8: error: expected identifier before 'static_assert'
     struct static_assert
            ^~~~~~~~~~~~~
    

    对应的代码如下:

    // mockcpp.h
    template <bool condition>
    struct static_assert
    {
        typedef int static_assert_failure[condition ? 1 : -1];
    };
    

    moclkcpp自己定义了一个static_assert,但是c++11已经引入了static_assert,两者冲突了。一个解决方案是c++11以后就不要编这段代码了:

    #if __cplusplus < 201103L
    template <bool condition>
    struct static_assert
    {
        typedef int static_assert_failure[condition ? 1 : -1];
    };
    #endif
    

    用了__cplusplus预编译宏,详细说明见这里
    修改后,编译终于通过了。

    代码已经放到github上了。

    相关文章

      网友评论

          本文标题:Mac OS X上编译mockcpp过程

          本文链接:https://www.haomeiwen.com/subject/qzsqzqtx.html