VS字符集设置影响编译成功与否

小卡拉米 2020-12-30 10:04:58
我使用开源库 muParser,是用来解析算式的
示例代码 :

#include <iostream>
#include "muParser.h"


int main(int argc, char* argv[])
{

double var_a = 1;
mu::Parser p;
p.SetExpr("3*8+9-1/8");
std::cout << p.Eval() << std::endl;
return 0;
}

使用 VS2019 ,必须将项目字符集设置成 “使用多字节字符集”,才能编译成功。

如果使用默认 “Unicode"字符集,IDE 会检测出类型错误:

E0415 不存在从 "const char [10]" 转换到 "std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>" 的适当构造函数 ConsoleApplication1
C2664 “void mu::ParserBase::SetExpr(const mu::string_type &)”: 无法将参数 1 从“const char [10]”转换为“const mu::string_type &” ConsoleApplication1



我将 "" 号字符串替换成 _T("") ,IDE 类型错误消失,但编译时报错:

错误 LNK2019 无法解析的外部符号 "__declspec(dllimport) public: void __cdecl mu::ParserBase::SetExpr(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)" (__imp_?SetExpr@ParserBase@mu@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@Z),函数 main 中引用了该符号 ConsoleApplication1

好像是无法连接动态库

请问,如果我一定要用 Unicode 字符集,这个问题能解决吗?
...全文
351 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
SXYLetme 2022-10-21
  • 打赏
  • 举报
回复

请问在github下载了muparser的源码后怎么在vs上使用,大佬秋解答

小卡拉米 2022-10-26
  • 举报
回复
@SXYLetme 进入到项目目录,输入:cmake . 就会生成 vs 项目文件了
小卡拉米 2022-10-26
  • 举报
回复
@SXYLetme 生成32位: cmake -G "Visual Studio 16 2019" -A Win32 CMakeLists.txt
小卡拉米 2020-12-31
  • 打赏
  • 举报
回复
引用 5 楼 SleekStone 的回复:
把"" 号字符串替换成 _T("") ,然后mu::Parser所在的库得连进来,如果是使用动态库的话,如果不是库而是文件的话,得把mu::Parser所在头文件和cpp文件包含进项目。
这个已经试过了,没有用。会找不到链接库
SleekStone 2020-12-31
  • 打赏
  • 举报
回复
把"" 号字符串替换成 _T("") ,然后mu::Parser所在的库得连进来,如果是使用动态库的话,如果不是库而是文件的话,得把mu::Parser所在头文件和cpp文件包含进项目。
赵4老师 2020-12-30
  • 打赏
  • 举报
回复
仅供参考:
#pragma warning(disable:4786)
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main () {
    wstring ws1,ws2;

    wcin.imbue(locale("chs"));
    wcout.imbue(locale("chs"));
    getline(wcin,ws1);
    getline(wcin,ws2);
    if (ws1.size()!=ws2.size()) {
        wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;
        return 1;
    }

    map<wchar_t,wchar_t> m1,m2;
    int n=ws1.size();

    for (int i=0;i<n;i++) {
        if (m1.find(ws1[i])==m1.end() && m2.find(ws2[i])==m2.end()) {
            m1[ws1[i]]=ws2[i];
            m2[ws2[i]]=ws1[i];
        } else {
            if (m1[ws1[i]]!=ws2[i] || m2[ws2[i]]!=ws1[i]) {
                wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;
                return 1;
            }
        }
    }
    wcout<<ws1<<L" 和 "<<ws2<<L" 对应"<<endl;
    return 0;
}
Chgooo 2020-12-30
  • 打赏
  • 举报
回复
引用 3 楼 管理員 的回复:
[quote=引用 2 楼 Chgooo 的回复:]IDE字符串编码是A,使用宽字符W的时候,IDE不认识,需要用_T,CA2W等转 推测你用的动态库里面是Assic单字符集,所以加_T转多字符集后,IDE认识了,动态库不认识 如果库是Assic,代码又必须用Unicode,写代码的时候用_T或CA2W转,调用库的地方再转回单字符集CW2A
具体怎么做呢?[/quote] 首先上面的回答有的把单字符集,多字符集弄错了,应该不影响理解 两个解决方法 1、项目必须使用Unicode字符集 代码中所有字符串用_T或CA2W转换,这样IDE不再报错 调用库函数时,字符串常量可以直接传入,char*,string等变量也可以直接传参 通过_T或CA2W转换过的字符串用CW2A转回单字符集再传参 2、项目可以使用多字符集,直接设置为多字符集,不用再来回转 反正一句话CW2A,CA2W来回转,不报错就是对的
小卡拉米 2020-12-30
  • 打赏
  • 举报
回复
引用 2 楼 Chgooo 的回复:
IDE字符串编码是A,使用宽字符W的时候,IDE不认识,需要用_T,CA2W等转 推测你用的动态库里面是Assic单字符集,所以加_T转多字符集后,IDE认识了,动态库不认识 如果库是Assic,代码又必须用Unicode,写代码的时候用_T或CA2W转,调用库的地方再转回单字符集CW2A
具体怎么做呢?
Chgooo 2020-12-30
  • 打赏
  • 举报
回复
IDE字符串编码是A,使用宽字符W的时候,IDE不认识,需要用_T,CA2W等转 推测你用的动态库里面是Assic单字符集,所以加_T转多字符集后,IDE认识了,动态库不认识 如果库是Assic,代码又必须用Unicode,写代码的时候用_T或CA2W转,调用库的地方再转回单字符集CW2A

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧