将icu sqlite扩展编译为静态链接icu

6
我想要将icu sqlite extension编译成静态链接并与icu一起使用。以下是我尝试过的内容,也许你能发现错误。
> cd icu/source
> ./runConfigureIcu Linux --enable-static --with-packaging-format=archive
...
> make

> cd ../../icu-sqlite
> gcc -o libSqliteIcu.so -shared icu.c -I../icu/source/common
      -I../icu/source/i18n -L ../icu/source/lib -lsicuuc -lsicui18n -lsicudata
...
> sqlite3
> .load "libSqliteIcu.so"
Undefined symbol utf8_countTrailBytes

文件

icu sqlite 扩展

从sqlite.org下载icu.c

ICU 4.2.1

从icu-project.org下载ICU4C

我的要求

  • 可在Linux和Windows上运行
  • 只有一个文件需要分发:libSqliteIcu.so

还有其他什么建议吗?

文档


嗨gs,如果您在Windows中成功编译和加载sqlite3中的icu模块,是否介意分享您使用的编译器(如vc++/mingw、cygwin)以及编译步骤?我可以在Linux上编译没有问题,但在Windows上仍然没有成功。 - YOU
我也想看到Windows的解决方案。有人可以提供必要的步骤吗? - PeterCo
2个回答

3

这个命令行在Linux上对我很有效:

g++ -shared --language c  -o libSqliteIcu.so icu.c  -I../icu/source/common -I../icu/source/i18n -lpthread -lm   -L../icu/source/lib -lsicui18n -lsicuuc -lsicudata  -lpthread -lm 

请注意库文件的顺序,以及使用g++确保即使编译C文件,也会引用c++运行时。
注:我使用了“icu-config --prefix=../icu/source --ldflags”的输出结果。

重要的区别似乎是你使用了g++而不是gcc。我会在Windows上尝试一下,如果可以的话,我会授予你赏金。 - Georg Schölly
还没有找到时间测试它,但是因为它适用于Linux,我仍然授予您赏金。 - Georg Schölly
对于任何通过搜索进入此页面的用户,以下命令在 Windows 上适用:gcc -shared icu.c -L C:\msys64\mingw64\lib -licuin -licuuc -licudt -lpthread -lm -o icu.dll。其中,icu-config --ldflags 命令会提供 -L/mingw64/lib -licuin -licuuc -licudt 参数。 - spot

1

我遇到了和你一样的问题。你可以编辑icu\include\utf8.h文件并替换以下行:

          #ifdef U_UTF8_IMPL
          U_EXPORT const uint8_t 
          #elif defined(U_STATIC_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION)
          U_CFUNC const uint8_t
          #else
          U_CFUNC U_IMPORT const uint8_t /* U_IMPORT2? */ /*U_IMPORT*/ 
          #endif
          utf8_countTrailBytes[256];

改为:

              const uint8_t countTrailBytes[256];

这样应该就可以解决问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接