【问题标题】:undefined reference to boost::system::system_category when using BOOST_ALL_NO_LIB building for android using QtCreator使用 QtCreator 为 android 构建 BOOST_ALL_NO_LIB 时对 boost::system::system_category 的未定义引用
【发布时间】:2015-11-23 21:17:58
【问题描述】:

Boost 并不真正关心 android 开发,所以我决定与其拼命尝试为 android 获取 boost 的静态库,不如随我的程序一起构建 boost 源。

我为我的构建添加了这个定义:

DEFINES += BOOST_ALL_NO_LIB

我添加了库和.cpp 文件:

 boost155/libs/system/src/error_code.cpp \
 boost155/libs/thread/src/pthread/once.cpp \
 boost155/libs/thread/src/pthread/once_atomic.cpp \
 boost155/libs/thread/src/pthread/thread.cpp \
 boost155/libs/thread/src/future.cpp \
 boost155/libs/thread/src/tss_null.cpp \
 boost155/libs/iostreams/src/file_descriptor.cpp \
 boost155/libs/iostreams/src/gzip.cpp \
 boost155/libs/iostreams/src/mapped_file.cpp \
 boost155/libs/iostreams/src/zlib.cpp \
 boost155/libs/chrono/src/chrono.cpp \
 boost155/libs/chrono/src/process_cpu_clocks.cpp \
 boost155/libs/chrono/src/thread_clock.cpp \
 boost155/libs/date_time/src/gregorian/date_generators.cpp \
 boost155/libs/date_time/src/gregorian/greg_month.cpp \
 boost155/libs/date_time/src/gregorian/greg_weekday.cpp \
 boost155/libs/date_time/src/gregorian/gregorian_types.cpp \
 boost155/libs/date_time/src/posix_time/posix_time_types.cpp
 boost155/libs/filesystem/src/codecvt_error_category.cpp \
 boost155/libs/filesystem/src/operations.cpp \
 boost155/libs/filesystem/src/path.cpp \
 boost155/libs/filesystem/src/path_traits.cpp \
 boost155/libs/filesystem/src/portability.cpp \
 boost155/libs/filesystem/src/unique_path.cpp \
 boost155/libs/filesystem/src/utf8_codecvt_facet.cpp \

头文件的包含方式与普通 PC 构建相同:

 INCLUDEPATH += ../libs/boost155/

项目编译没有错误,但在链接期间我收到链接器错误:

./libs/boost155/boost/system/error_code.hpp:323: error: undefined reference to 'boost::system::system_category()'
../libs/boost155/boost/thread/exceptions.hpp:51: error: undefined reference to 'boost::system::system_category()'
../libs/boost155/boost/asio/error.hpp:224: error: undefined reference to 'boost::system::system_category()'
../libs/boost155/boost/system/error_code.hpp:222: error: undefined reference to 'boost::system::generic_category()'
../libs/boost155/boost/system/error_code.hpp:223: error: undefined reference to 'boost::system::generic_category()'
../libs/boost155/boost/system/error_code.hpp:224: error: undefined reference to 'boost::system::system_category()'
../libs/boost155/boost/chrono/detail/inlined/posix/chrono.hpp:59: error: undefined reference to 'boost::system::throws'
../libs/boost155/boost/chrono/detail/inlined/posix/chrono.hpp:113: error: undefined reference to 'boost::system::throws'
../libs/boost155/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp:118: error: undefined reference to 'boost::system::throws'
../libs/boost155/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp:194: error: undefined reference to 'boost::system::throws'

我错过了什么.cpp

【问题讨论】:

    标签: android c++ boost


    【解决方案1】:

    BOOST_ALL_NO_LIB 只是告诉标题不要链接(#pragma lib(...))。 当然如果您使用它们,这会导致无法解决的外部问题。

    我建议您应该考虑链接到静态库,而不是手动选择一些 cpp 文件。

    有点问题,也许您已经添加了 cpp 文件,但它们实际上并没有参与构建(您检查过吗?)。

    否则,也许您已经进行了一些修改并定义了BOOST_ERROR_CODE_HEADER_ONLY,但并非在所有情况下都如此。在这种情况下,您会得到未定义的符号甚至编译和链接 error_code.cpp。原因是该文件有条件地编译了某些部分。

    【讨论】:

    • 恐怕那个 boost 版本出了点问题。我切换到boost 159(没有改变任何其他东西)并且它编译没有问题。这不是第一次切换到更新或旧的 bo​​ost 版本修复了奇怪的问题。
    • 当然不是。我不知道是什么让 Boost 对错误免疫 :)
    • 随时添加它作为答案。它可以在未来帮助其他人(好吧,只要人们仍然使用受影响的版本)
    • 当然,如果 boost 提供了为 Android 构建静态库的可行方式,我将不胜感激。但到目前为止,我还没有经历过 Windows 的无痛构建。我目前的方法在这方面似乎很有希望,因为我不需要处理静态库的所有 64/32 位和其他问题。
    【解决方案2】:

    我通过切换到 boost 1.59 解决了这个问题 - 这意味着我的 1.55 版本可能有问题。

    【讨论】:

      猜你喜欢
      • 2015-04-09
      • 2017-02-25
      • 2013-10-19
      • 1970-01-01
      • 2012-06-30
      • 2021-03-30
      • 2016-05-26
      • 2019-07-05
      • 2012-11-08
      相关资源
      最近更新 更多