ubuntu - 在 Linux 中使用 Boost 1.50 语言环境编译的 ICU 问题

标签 ubuntu boost unicode locale icu

所以,我在编译使用 boost 1.50.0 库的项目时遇到了问题,更具体地说是 boost 'locale' 库。我在编译时收到此错误:

(.text._ZN5boost6locale8impl_icu10num_formatIcED2Ev[_ZN5boost6locale8impl_icu10num_formatIcED5Ev]+0x20):-1: error: undefined reference to `icu_48::Locale::~Locale()'

我的直接假设是我没有正确链接项目中的 libicu-dev 库,并将该库添加到我的 cmake 文件(FindICU.cmake)中。

FindICU.cmake:
# Try to find the ICU library
#  ICU_FOUND - system has ICU
#  ICU_INCLUDE_DIR - the ICU include directory
#  ICU_LIBRARY - the ICU library

FIND_PATH(ICU_INCLUDE_DIR NAMES utf8.h utypes.h PATH_SUFFIXES unicode)
SET(_ICUI18N_STATIC_LIBS libicui18n.a)
SET(_ICUI18N_SHARED_LIBS libicui18n.dll.a icui18n)
SET(_ICUUC_STATIC_LIBS libicuuc.a)
SET(_ICUUC_SHARED_LIBS libicuuc.dll.a icuuc)
IF(USE_STATIC_LIBS)
    FIND_LIBRARY(ICUI18N_LIBRARY NAMES ${_ICUI18N_STATIC_LIBS} ${_ICUI18N_SHARED_LIBS})
    FIND_LIBRARY(ICUUC_LIBRARY NAMES ${_ICUUC_STATIC_LIBS} ${_ICUUC_SHARED_LIBS})
ELSE()
    FIND_LIBRARY(ICUI18N_LIBRARY NAMES ${_ICUI18N_SHARED_LIBS} ${_ICUI18N_STATIC_LIBS})
    FIND_LIBRARY(ICUUC_LIBRARY NAMES ${_ICUUC_SHARED_LIBS} ${_ICUUC_STATIC_LIBS})
ENDIF()
SET(ICU_LIBRARIES ${ICUI18N_LIBRARY} ${ICUUC_LIBRARY})
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ICU DEFAULT_MSG ICU_LIBRARIES ICU_INCLUDE_DIR)
MARK_AS_ADVANCED(ICU_LIBRARIES ICU_INCLUDE_DIR)

并让我的项目在这里搜索 boost 库,如下所示:
# find boost
set(REQUIRED_BOOST_COMPONENTS locale system filesystem regex thread)
if(WIN32)
    set(Boost_THREADAPI win32)
    set(framework_DEFINITIONS ${framework_DEFINITIONS} -DBOOST_THREAD_USE_LIB) # fix boost thread linkage
    set(REQUIRED_BOOST_COMPONENTS ${REQUIRED_BOOST_COMPONENTS} chrono) # mingw32 does not have std::thread
else()
    find_package(ICU)
    set(Boost_LIBRARIES ${Boost_LIBRARIES} ${ICU_LIBRARIES})
endif()
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_LIBS ${USE_STATIC_LIBS})
find_package(Boost 1.50.0 COMPONENTS ${REQUIRED_BOOST_COMPONENTS} REQUIRED)

它认为没问题
-- Found ICU: /usr/lib/libicui18n.a;/usr/lib/libicuuc.a 
-- Boost version: 1.50.0
-- Found the following Boost libraries:
--   locale
--   system
--   filesystem
--   regex
--   thread

但是当我尝试编译时仍然出现此错误。我正在运行 Ubuntu 12.04,从 https://launchpad.net/~28msec/+archive/boost 获取我的 boost 库12.04 版本的存储库确实为 boost 1.50 库提供了一个包。我正在使用 libicu-dev (4.6.x) 的标准包。

编辑:我还编译了我自己的 1.50.0 boost 库,配置有和没有 ICU(都没有工作)我还编译了我自己的 ICU 库,但仍然是同样的错误......我完全被这个难住了。

也许有人可以帮助我弄清楚发生了什么。任何帮助表示赞赏!谢谢,本。

最佳答案

版本号(在链接中使用)由 ICU header 设置,因此您似乎正在针对 4.8 进行编译,但试图链接到其他内容(例如 4.6)。 uvernum.h(或在旧版本中,uversion.h)包含版本号。

关于ubuntu - 在 Linux 中使用 Boost 1.50 语言环境编译的 ICU 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251151/

相关文章:

node.js - 收到错误 : Cannot find module 'errno' running node script

c++ - 使用 std::shared_ptr<std::vector> 而不是 boost::shared_array 有意义吗?

java - 如何在不使用 BOM 且以非 ASCII 字符开头的情况下识别文件的不同编码?

svn - 我的源代码管理文件在 Linux for TeamCity 中的位置

python - Cloud Vision API 客户端抛出操作系统错误 "too many open files"

c++ - boost::copy_graph 的vertex_copy 是如何工作的?

c++ - Boost Graph 查找一组顶点的邻居

r - 如何在R中使用gsub删除奇怪的字符?

Java字符串在数据库中保存为unicode

c - 默认 gcc 编译器选项是特定于 gcc 版本还是特定于操作系统,还是两者兼而有之?