Mongo-cxx-driver Windows平台编译记录

Mongo-cxx-driver Windows平台编译记录

官方的代码源在这里:https://github.com/mongodb/mongo-cxx-driver,从这里clone代码即可,官方推荐新用户使用legacy分支,好,就用这个。
用到的工具:
1. Visual Studio。我用的是VS2013
2. Boost库。我用的版本是1.55。这里需要注意的是,编译的时候,默认只会编译静态版本的库,你需要手动编译动态库,bjam命令行加入link=shared即可。这一步非常重要,否则在后面链接的时候很可能会提示找不到Boost库文件。我一直卡在这里,费了很长时间。
3. Python。2.7最好。不支持3以上版本。
4. Scons。这是和CMake类似的工具,没它不能编译这个库。不过这个东西不好用,没CMake好用。

开始编译

吐槽下这个库的编译,每一种ABI格式的库它都要重新编译一遍,尼玛,一次编译完全不行吗?
第一种,MDd,动态链接到运行时库的调试静态库:

scons --32 --prefix=path_to_install --cpppath=path_to_boost_include --libpath=path_to_boost_lib --dynamic-windows --dbg=on install 

第二种,MD,动态链接到运行时库的静态库:

scons --32 --prefix=path_to_install --cpppath=path_to_boost_include --libpath=path_to_boost_lib --dynamic-windows install 

区别就是–dbg=on这里。–dynamic-windows这个指示运行时库是动态链接的。这个用的最多,你要是想静态链接到运行时库(很少用,至少对我来说),把这个选项去掉就行了。
假如你要编译成动态库,只需要加入–sharedclient这个选项即可,它指定把库编译成动态库。

编译出所有ABI格式的库,一共要编译4遍。反人类啊,尼玛!!!编译速度也不敢恭维,很慢。

测试程序

如果你是链接到mongo-cxx-driver的静态库,那么记得加入预处理器STATIC_LIBMONGOCLIENT,否则会出现ABI不对应的问题。不加就是链接到动态库。
链接到libmongoclient的静态库还有一个问题就是,可能会出现说Boost库某某库,已经定义了,遇到这种,就需要你把这个库加入到忽略特定默认库里去,否则会链接失败的。这里又是一个坑,唉。。。
测试代码:


#include <iostream>
#include <WinSock2.h>
#include <mongo/client/dbclient.h>

void run()
{
    mongo::DBClientConnection c;
    c.connect("localhost");
}

int main(int argc, char** argv)
{
    mongo::client::initialize();

    try
    {
        run();
        std::cout << "连接成功" << std::endl;
    }
    catch (const mongo::DBException& e)
    {
        std::cout << "错误: " << e.what() << std::endl;
    }
    getchar();
    return 0;
}

winsock2.h必须在dbclient.h之前包含,这个是这个库要求的。如果和MFC配合,估计又得出各种编译错误了,好在我早已不用MFC了。

就这么多,总结一下是,这个库用CMake可能更好一些。各种编译错误,各种坑,在Windows上编译需要注意的问题比较多。Linux没有这些问题。

你可能感兴趣的:(C++,mongodb,代码,编译,boost)