1. 由于当前编译的程序使用的运行时库和当前程序依赖的某个程序的运行时库不一样导致的。
这个遇到的比较多,网上讨论的也比较多。(另外在编译 Boost 库的时候,你关注他的选项就会发现一些这方面的区别。)
问题的根源: “Debug” 版本还是 "Release" 版本把程序运行时库分成两类;再加上是否支持多线程,运行时库会被分成四个;再加上使用的库(多线程版本) 是否是 DLL(动态库) 版本,而分成六个(不是八个) 不同的运行时库。如下表:
/MD: 多线程(M) + DLL (D) + release 版本的运行时库
/MDd: 多线程(M) + DLL (D) + debug 版本的运行时库
/ML: 单线程 + Lib(L) + release 版本
/MLd: 单线程 + Lib(L) + debug 版本
/MT: 静态库 + 多线程 + release 版本
/MTd: 静态库 + 多线程 + debug 版本
具体解释见: http://www.cnblogs.com/myitm/archive/2010/10/07/1845241.html
配置属性 -> c/c++ -> 代码生成 -> 运行时库里设置。
vs08 里已不再提供单线程运行时库选择
解决方法: 把程序和依赖库的运行时库调成一样的就好了
2. 由于程序和依赖库的字符集不一样导致的
这个网上有,我自己没有遇到多。一般都是设置成多字节字符集。
3. 使用不同的库的时候,不同的库里有相同定义。
我遇到的是同时用了 gtest 和 boost 库时,重复定义了 tr1::tuple.
解决办法: gtest 库里提供了宏 GTEST_USE_OWN_TR1_TUPLE,我们只要在 “配置属性-> c/c++ -> 预处理器-> 预处理器定义”里添加上 GTEST_USE_OWN_TR1_TUPLE=0 禁掉这个宏就可以了。具体可以看这里的注释:
http://googletest.googlecode.com/svn-history/r343/trunk/include/gtest/internal/gtest-port.h
4. 使用 luabind 时, 链接发生 luabind::error::error 重复定义错误
在预处理定义处加上 LUABIND_DYNAMIC_LINK 就可以了,我没认真研究;具体可以看这里http://www.rasterbar.com/products/luabind/docs.html
看来研究开源库的注释和帮助文档对于解决一些编译链接错误,正确的设置选项(build option) 很有用啊