• 5721阅读
  • 7回复

[提问]为什么在vc中调用(qt)MinGW编译的string类函数总是运行时出错 [复制链接]

上一主题 下一主题
离线iynaur
 

只看楼主 倒序阅读 楼主  发表于: 2012-09-25
关键词: stringdll
如题。主程序在vc中编译通过,运行时出错
如果主程序用(qt)MinGW编译就能正常使用。
是不是文本编码的问题?如何解决?
dll  代码
#include <string>
using namespace std;
//extern "C" __declspec(dllexport) string token(string ss, char a)
__declspec(dllexport) string token(string ss, char a)
{    string s=ss;    
int l;    
l=s.length();    
int i=0;    
while (i<l)    
{        if ( s [ i ] ==a)        {            s=s.substr(0,i);            break;        }      
i++;    }    
return s;
}
主程序代码
#include <windows.h>
#include <iostream>
#include<string>
#include<fstream>
#include<stdio.h>
using namespace std;
typedef string (*token_func_t) (string ss,char a);
int main(int argc, CHAR* argv[])
{// 加载DLL
    HINSTANCE   hInst   =   LoadLibrary("str.dll");
if (hInst == 0)
{cout<<"no dll found!";}
else{

    token_func_t  token = (token_func_t)GetProcAddress(hInst,"token");              
    cout<<token("abcd",'c');          
}        
int var;
cin >> var;
}  






离线XChinux

只看该作者 1楼 发表于: 2012-09-25
你都extern C了,那怎么还用string??而不是char *?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线iynaur

只看该作者 2楼 发表于: 2012-09-25
回 1楼(XChinux) 的帖子
已经修改了,还是不行啊。dll是用mingw 编译的。主程序是用vc++编译的。 如果主程序 用mingw编译就可以正常运行。费解。
离线dbzhang800

只看该作者 3楼 发表于: 2012-09-25
Re:回 1楼(XChinux) 的帖子
引用第2楼iynaur于2012-09-25 12:29发表的 回 1楼(XChinux) 的帖子 :
已经修改了,还是不行啊。dll是用mingw 编译的。主程序是用vc++编译的。 如果主程序 用mingw编译就可以正常运行。费解。


C++标准没有规定ABI,所以 不同厂商的编译器、不同版本号的同一厂商的编译器、甚至是使用了不同编译选项的同一个编译器 编译出来的东西一般来说不能混用!
离线iynaur

只看该作者 4楼 发表于: 2012-09-25
回 3楼(dbzhang800) 的帖子
但我用vc++主程序调用QT的其他dll都没问题啊,只有在遇到string型的函数时,程序在运行中就会出错。
感觉可能是因为ansi /unicode编码不统一的问题导致。
离线dbzhang800

只看该作者 5楼 发表于: 2012-09-25
Re:回 3楼(dbzhang800) 的帖子
引用第4楼iynaur于2012-09-25 14:44发表的 回 3楼(dbzhang800) 的帖子 :
但我用vc++主程序调用QT的其他dll都没问题啊,只有在遇到string型的函数时,程序在运行中就会出错。
感觉可能是因为ansi /unicode编码不统一的问题导致。


你的问题描述的有些歧义。
  
首先:不要强调VC++ 和 Qt,二者没有可比较性,一个是IDE,一个是库
  
你需要的描述的是,你的Qt是用什么版本的编译器编译的,MinGW还是MSVC?如果后者的话,是哪个版本的MSVC?启用了什么选项?
  
其次,你需要了解。


假设你打开Visual studio,创建了一个解决方案,里面包含一个应用程序和一个动态库,然后接口用到了string,但是两个工程的编译选项不一致,比如,一个使用了 /Zc:wchar_t- 而另一个使用了/Zc:wchar_t ,那么就会出现你描述的这种错误。
离线iynaur

只看该作者 6楼 发表于: 2012-09-25
回 5楼(dbzhang800) 的帖子
初学者没描述清楚。我用qt creator使用mingw编译的dll。然后主程序用VC++编译的,运行出错。
离线dbzhang800

只看该作者 7楼 发表于: 2012-09-26
Re:回 5楼(dbzhang800) 的帖子
引用第6楼iynaur于2012-09-25 19:04发表的 回 5楼(dbzhang800) 的帖子 :
初学者没描述清楚。我用qt creator使用mingw编译的dll。然后主程序用VC++编译的,运行出错。

除非是C接口,不然无法混用!
快速回复
限100 字节
 
上一个 下一个