现在的位置: 首页 > 综合 > 正文

关于在工程中多次包含库文件引发的问题

2013年10月03日 ⁄ 综合 ⁄ 共 828字 ⁄ 字号 评论关闭

问题描述:

新工程中使用了tsGUI的静态库,这是一个类似于OpenCV的HighGUI的可以快速的在界面上显示调试信息的库。
内部使用了std::string类。 因为使用了std::string, 导致该tsGUI的debug版本仅能用于debug项目,release版本同样仅能用于release项目。这是之前就得出的基本结论。

新项目中,是这样包含tsGUI库的
#ifdefine _DEBUG
  #pragma comment(lib, "tsGUI_d.lib") // debug版
#else
  #pragma comment(lib, "tsGUI.lib") //release版
#endif

可是工程运行总是崩溃。。总是在tsPutText处崩溃。头疼啊。

问题解决:
分析了下,虽然调用了tsGUI里面的tsNamedWindow, tsResizeWindow等函数,但都没有崩,仅在tsPutText处崩,相比tsPutText里面用了std::string, 查看源码,果然
void tsPutText( const char* szTitleName, int x, int y, const char* szText, DWORD dwColor )
{
   ...
   PaintRecord pr;
   pr.strText = szText; // strText是个std::string类型
   ...
}
看来问题还是跟std::string的debug和release版本相关。

然后就在工程中搜索tsGUI
发现,在另外一个cpp文件里,没有使用_DEBUG开关而直接包含了 tsGUI.lib库。
原来,编译器在第一次引入tsGUI库的时候,在另一个文件里发现了tsGUI.lib库,就先行把其链接了进来,当后来再发现tsGUI_d.lib库的时候,发现已经有tsGUI.lib可以满足要求了,就忽略了tsGUI_d.lib. 这导致了我的debug工程链接了release版的tsGUI.lib
问题解决。

抱歉!评论已关闭.