首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用c++编译和运行icu4c源文件需要帮助

使用c++编译和运行icu4c源文件需要帮助
EN

Stack Overflow用户
提问于 2022-04-10 12:38:04
回答 2查看 99关注 0票数 0

操作系统: Windows 10

编译器: g++.exe (MinGW-W64x86_64-POSIX-seh,由Brecht构建) 11.2.0

外壳: msys2

请描述这个bug:

我想在我的class UnicodeString代码中使用icu4c中的c++。我下载了icu4c源代码并对其进行了编译。我用icu4c库编译了我的代码,但是结果.exe文件无法成功执行。如果我在.exe中运行该msys2文件,它就不会输出任何内容。如果我在windows文件资源管理器中双击那个.exe文件,它会显示一个对话框,上面写着"xxx.exe -找不到条目。无法在动态链接库xxx.exe中找到程序入口点xxxxx“。

我所做的:

  1. 下载icu4c-70_1-src.zip并编译此链接编译-ICU与-MinGW的步骤
代码语言:javascript
复制
$ cd icu/source
$ CC=gcc CXX=g++  ./runConfigureICU MinGW prefix=$PWD/../dist
make && make install

当我运行make install时,它会显示如下错误:创建符号链接失败。但是目录中存在像libicuuc.dll.a这样的文件。所以我认为我已经成功地编译了icu4c。

  1. 我的c++源文件
代码语言:javascript
复制
#include <unicode/unistr.h>
#include <unicode/ustream.h>

#include <iostream>

using namespace std;
using namespace icu;

int main() {
    cout << "hello,world" << endl;

    UnicodeString s("你好,世界");
    cout << s << endl;
}
  1. 编译我的代码
代码语言:javascript
复制
g++ main.cpp -I/c/Users/stskyblade/source/icu4c-70_1-src/icu/dist/include -L/c/Users/stskyblade/source/icu4c-70_1-src/icu/dist/lib -licuuc -licuio

执行./a.exe或双击文件资源管理器中的图标

我所期望的

我的程序可以用英文和中文输出hello,world

EN

回答 2

Stack Overflow用户

发布于 2022-04-11 13:37:58

我试过你的代码,效果很好。

但是您正在构建应用程序的共享版本,这使得.exe文件依赖于.dll文件,在运行.exe时很可能找不到这些文件。

有几种方法可以解决这个问题:

  • (最简单、最快捷)将a.exe复制到您解压缩icu4c-70_1-src.zip文件所在位置的文件夹中,并从那里运行它。
  • 将所需的.dll文件(如果不知道是哪些文件)复制到与a.exe相同的位置,然后再次尝试运行a.exe
  • 在运行.dll之前将包含PATH文件的位置添加到PATH环境变量(例如,在命令提示符:SET PATH=C:\Program Files\icu4c-70_1-Win64-MSVC2019\bin64;%PATH%中)
  • 构建一个将a.exe链接到静态库的静态版本,但这也可能需要手动指定icu的依赖项及其依赖关系,等等。

警告:确保不要混合32位和64位的.exe和.dll文件.

票数 1
EN

Stack Overflow用户

发布于 2022-04-11 09:09:55

我在这个问题上花了一些时间。答案是:这个程序在执行时使用了错误的dll文件。

我的计算机中有两个版本的ICU4C dll文件。

其中一些文件位于C:\Program Files\icu4c-70_1-Win64-MSVC2019\bin64目录中,直接从ICU4C的github发布页面下载。它们是用微软的编译器构建的。此目录位于PATH环境变量中。

另一个版本位于目录C:\Users\xxxx\source\icu4c-70_1-src\icu\dist\bin中。它们是我自己用混合W64 GCC编译器构建的.并且这个目录不在PATH环境变量中。

我用第二个版本的库文件编译了我的程序。但是当我执行我的程序时,系统使用第一个版本的dll文件。就这样。这两个版本的库是不兼容的。

符号_ZN6icu_70lsERSoRKNS_13UnicodeStringE是我的函数在用MinGW版本库编译程序时调用的函数。当我执行我的程序时,这个符号的入口点应该由ICUIO70.dll提供。但是MSVC版本库没有提供它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71816676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档