C++ CMake 构建错误:未定义对 `boost::throw_exception(std::exception const&) 的引用

问题描述 投票:0回答:2

我一直在尝试将 boost.Log 集成到我的项目中,但是在构建时我收到错误消息:

/usr/lib/cross/boost/lib/libboost_date_time.so: undefined reference to `boost::throw_exception(std::exception const&)'

我已经检查过确保我没有在任何地方定义 BOOST_NO_EXCEPTIONS,但我仍然对为什么会收到此错误感到困惑。我的CMAKE文件如下:

set(Boost_INCLUDE_DIR /usr/lib/cross/boost/include)
set(Boost_LIBRARY_DIR /usr/lib/cross/boost/lib)
find_package(Boost 1.63.0 COMPONENTS system filesystem log REQUIRED)

message(status "** Boost Include: ${Boost_INCLUDE_DIR}")
message(status "** Boost Libraries: ${Boost_LIBRARY_DIRS}")
message(status "** Boost Libraries: ${Boost_LIBRARIES}")

set (PROJECT_LINK_LIBS thrift crypto ssl sqlcipher)

link_directories( $ENV{LD_LIBRARY_PATH}
                ${Boost_LIBRARY_DIRS}
)

include_directories( $ENV{LD_INCLUDE_PATH}
$ENV{LD_INCLUDE_PATH}/sqlcipher
${Boost_INCLUDE_DIR}
)

add_executable(databaseManager ${MY_SRC})

target_link_libraries(databaseManager ${Boost_LIBRARIES} ${PROJECT_LINK_LIBS} )

库的 FIND 输出似乎没问题:

-- Boost version: 1.63.0
1> -- Found the following Boost libraries:
1> --   system
1> --   filesystem
1> --   log
1> --   date_time
1> --   log_setup
1> --   thread
1> --   regex
1> --   chrono
1> --   atomic
1> status** Boost Include: /usr/lib/cross/boost/include
1> status** Boost Libraries: /usr/lib/cross/boost/lib
1> status** Boost Libraries:
/usr/lib/cross/boost/lib/libboost_system.so;/usr/lib/cross/boost/lib/libboost_filesystem.so;/usr/lib/cross/boost/lib/libboost_log.so;/usr/lib/cross/boost/lib/libboost_date_time.so;/usr/lib/cross/boost/lib/libboost_log_setup.so;/usr/lib/cross/boost/lib/libboost_thread.so;/usr/lib/cross/boost/lib/libboost_regex.so;/usr/lib/cross/boost/lib/libboost_chrono.so;/usr/lib/cross/boost/lib/libboost_atomic.so

最后,链接步骤失败的详细输出:

/home/imx7/build/imx7-firmware-dev-package/src/maketools/obj.iMX7/bin/arm-devolo-linux-g++  -fexceptions -frtti -pthread -O3 -DNDEBUG  -rdynamic CMakeFiles/databaseManager.dir/DatabaseManagerEventHandler.cpp.o CMakeFiles/databaseManager.dir/DatabaseManagerHandler.cpp.o CMakeFiles/databaseManager.dir/DatabaseManagerServer.cpp.o CMakeFiles/databaseManager.dir/DatabaseManagerService.cpp.o CMakeFiles/databaseManager.dir/Logger.cpp.o CMakeFiles/databaseManager.dir/dbConnection.cpp.o CMakeFiles/databaseManager.dir/thrift_common/base_constants.cpp.o CMakeFiles/databaseManager.dir/thrift_common/base_types.cpp.o CMakeFiles/databaseManager.dir/thrift_dbManager/DatabaseManager.cpp.o CMakeFiles/databaseManager.dir/thrift_dbManager/dbManager_constants.cpp.o CMakeFiles/databaseManager.dir/thrift_dbManager/dbManager_types.cpp.o CMakeFiles/databaseManager.dir/thrift_supervisor/Info.cpp.o CMakeFiles/databaseManager.dir/thrift_supervisor/Supervision.cpp.o CMakeFiles/databaseManager.dir/thrift_supervisor/supervision_constants.cpp.o CMakeFiles/databaseManager.dir/thrift_supervisor/supervision_types.cpp.o  -o databaseManager  -L/usr/lib/cross/official_libs  -L/usr/lib/cross/boost/lib -Wl,-rpath,/usr/lib/cross/official_libs:/usr/lib/cross/boost/lib: /usr/lib/cross/boost/lib/libboost_system.so /usr/lib/cross/boost/lib/libboost_filesystem.so /usr/lib/cross/boost/lib/libboost_chrono.so /usr/lib/cross/boost/lib/libboost_log.so /usr/lib/cross/boost/lib/libboost_date_time.so /usr/lib/cross/boost/lib/libboost_log_setup.so /usr/lib/cross/boost/lib/libboost_thread.so /usr/lib/cross/boost/lib/libboost_regex.so /usr/lib/cross/boost/lib/libboost_atomic.so -lthrift -lcrypto -lssl -lsqlcipher 
/home/imx7/build/imx7-firmware-dev-package/src/maketools/binaries.iMX7/tools/bin/../lib/gcc/arm-devolo-linux-gnueabihf/4.9.4/../../../../arm-devolo-linux-gnueabihf/bin/ld: warning: libz.so.1, needed by /usr/lib/cross/official_libs/libsqlcipher.so, not found (try using -rpath or -rpath-link)
/usr/lib/cross/boost/lib/libboost_date_time.so: undefined reference to `boost::throw_exception(std::exception const&)'
collect2: error: ld returned 1 exit status
src/CMakeFiles/databaseManager.dir/build.make:470: recipe for target 'src/databaseManager' failed
make[2]: Leaving directory '/var/cppbuild/DatabaseManager/build/Linux-Release'
CMakeFiles/Makefile2:88: recipe for target 'src/CMakeFiles/databaseManager.dir/all' failed
make[1]: Leaving directory '/var/cppbuild/DatabaseManager/build/Linux-Release'
make[2]: *** [src/databaseManager] Error 1
make[1]: *** [src/CMakeFiles/databaseManager.dir/all] Error 2
Makefile:132: recipe for target 'all' failed
make: *** [all] Error 2

有谁知道我还可以检查或做什么来克服这个错误?

干杯!

******** 编辑 *********

有一些关于向组件列表添加例外的建议。我已经尝试过并测试了这一点,不幸的是收到了同样的错误。

唯一值得注意的是所有主要库都是动态链接的(.so 版本引入),而 boost_exception 是静态引入的(.a 版本)。

新版本的 find_package 命令:

find_package(Boost 1.63.0 COMPONENTS system atomic filesystem log exception REQUIRED)

上述更改生成错误:

/home/imx7/build/imx7-firmware-dev-package/src/maketools/obj.iMX7/bin/arm-devolo-linux-g++  -fexceptions -frtti -pthread -g  -rdynamic CMakeFiles/databaseManager.dir/DatabaseManagerEventHandler.cpp.o CMakeFiles/databaseManager.dir/DatabaseManagerHandler.cpp.o CMakeFiles/databaseManager.dir/DatabaseManagerServer.cpp.o CMakeFiles/databaseManager.dir/DatabaseManagerService.cpp.o CMakeFiles/databaseManager.dir/Logger.cpp.o CMakeFiles/databaseManager.dir/dbConnection.cpp.o CMakeFiles/databaseManager.dir/thrift_common/base_constants.cpp.o CMakeFiles/databaseManager.dir/thrift_common/base_types.cpp.o CMakeFiles/databaseManager.dir/thrift_dbManager/DatabaseManager.cpp.o CMakeFiles/databaseManager.dir/thrift_dbManager/dbManager_constants.cpp.o CMakeFiles/databaseManager.dir/thrift_dbManager/dbManager_types.cpp.o CMakeFiles/databaseManager.dir/thrift_supervisor/Info.cpp.o CMakeFiles/databaseManager.dir/thrift_supervisor/Supervision.cpp.o CMakeFiles/databaseManager.dir/thrift_supervisor/supervision_constants.cpp.o CMakeFiles/databaseManager.dir/thrift_supervisor/supervision_types.cpp.o  -o databaseManager  -L/usr/lib/cross/official_libs  -L/usr/lib/cross/boost/lib -Wl,-rpath,/usr/lib/cross/official_libs:/usr/lib/cross/boost/lib: /usr/lib/cross/boost/lib/libboost_system.so /usr/lib/cross/boost/lib/libboost_atomic.so /usr/lib/cross/boost/lib/libboost_filesystem.so /usr/lib/cross/boost/lib/libboost_log.so /usr/lib/cross/boost/lib/libboost_exception.a /usr/lib/cross/boost/lib/libboost_date_time.so /usr/lib/cross/boost/lib/libboost_log_setup.so /usr/lib/cross/boost/lib/libboost_thread.so /usr/lib/cross/boost/lib/libboost_regex.so /usr/lib/cross/boost/lib/libboost_chrono.so -lthrift -lcrypto -lssl -lsqlcipher 
/home/imx7/build/imx7-firmware-dev-package/src/maketools/binaries.iMX7/tools/bin/../lib/gcc/arm-devolo-linux-gnueabihf/4.9.4/../../../../arm-devolo-linux-gnueabihf/bin/ld: warning: libz.so.1, needed by /usr/lib/cross/official_libs/libsqlcipher.so, not found (try using -rpath or -rpath-link)
/usr/lib/cross/boost/lib/libboost_date_time.so: undefined reference to `boost::throw_exception(std::exception const&)'
collect2: error: ld returned 1 exit status
src/CMakeFiles/databaseManager.dir/build.make:471: recipe for target 'src/databaseManager' failed
make[2]: Leaving directory '/var/cppbuild/DatabaseManager/build/Linux-Debug'
CMakeFiles/Makefile2:88: recipe for target 'src/CMakeFiles/databaseManager.dir/all' failed
make[1]: Leaving directory '/var/cppbuild/DatabaseManager/build/Linux-Debug'
make[2]: *** [src/databaseManager] Error 1
make[1]: *** [src/CMakeFiles/databaseManager.dir/all] Error 2
Makefile:132: recipe for target 'all' failed
make: *** [all] Error 2
c++ boost cmake
2个回答
6
投票

如果其他人遇到过此问题,请更新。

我能够让它工作的唯一方法是使用以下代码片段:

#define BOOST_NO_EXCEPTIONS
#include <boost/throw_exception.hpp>
void boost::throw_exception(std::exception const & e){
//do nothing
}

我尝试了库的排序,显式地将它们全部包含在内,使用 findBoost.cmake ,但一切都无济于事。我想这只是一个随机的怪癖!


0
投票

我从 boost 1.82 更新到 1.84 时遇到了同样的问题。突然我遇到了同样的未解决的外部符号错误。

我必须将目标 Boost::throw_exception 显式链接到我的库。 我在 Windows 上使用 vcpkg。也许他们在链接到其他 boost 库时更改了 Boost::throw_exception 的范围。现在,当我们不明确链接这些目标时,它就会崩溃。

target_link_libraries(my_lib PRIVATE Boost::chrono Boost::filesystem Boost::system Boost::throw_exception)

© www.soinside.com 2019 - 2024. All rights reserved.