c++11 - gcc 4.9.2 的 Boost 1.57 文件系统/系统链接器错误

标签 c++11 boost boost-filesystem gcc4.9 boost-system

我正在构建一个 api 库并将其用作单元测试项目的共享。 API 正在按以下方式进行一些调用

#include <boost/filesystem.hpp>

void LoadResources(const std::string& dataPath)
{
    boost::filesystem::path path(dataPath);
    boost::filesystem::path file("test.txt");
    boost::filesystem::path canonical = boost::filesystem::canonical(dataPath / file);

    if (boost::filesystem::exists(canonical)) {
         ...
    }
}

然后单元测试只是调用该函数,但由于链接器错误我无法构建它

/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::filesystem::detail::canonical(boost::filesystem::path const&, boost::filesystem::path const&, boost::system::error_code*)'
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::filesystem::detail::current_path(boost::system::error_code*)'
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::system::system_category()'
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::system::generic_category()'
/home/ubuntu/tonkatsu/lib/libdominion.so: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
collect2: error: ld returned 1 exit status

但是我的 CMakeList.txt 已正确设置

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14")
find_package(Boost COMPONENTS system filesystem log thread unit_test_framework REQUIRED)
...
target_link_libraries(unittest ${Boost_LIBRARIES} dominion)

并且 make VERBOSE=1 也是正确的

/usr/bin/c++    -Wall -std=c++14    CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/main.cpp.o CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/dominion/api.cpp.o CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/dominion/attributes.cpp.o CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/dominion/dice.cpp.o CMakeFiles/unittest.dir/home/ubuntu/tonkatsu/src/unittest/lib/minicsv.cpp.o  -o /home/ubuntu/tonkatsu/bin/unittest -rdynamic /usr/local/lib/libboost_system.so /usr/local/lib/libboost_filesystem.so /usr/local/lib/libboost_log.so /usr/local/lib/libboost_thread.so /usr/local/lib/libboost_unit_test_framework.so -lpthread /home/ubuntu/tonkatsu/lib/libdominion.so -Wl,-rpath,/usr/local/lib:/home/ubuntu/tonkatsu/lib

在开始使用 boost::filesystem 之前我没有遇到任何问题。这在 VS2013 上工作得很好,但在使用 GCC 4.9.2 的 Linux 上我似乎不明白为什么。我一开始以为boost版本可能是错误的(ubuntu只提供1.55,我在windows上使用1.57),所以我也在linux上构建了1.57,但错误仍然存​​在。还有那个boost bug与 c++11 相关,但已在 1.57 中修复

我看过关于这个主题的类似问题,但人们大多忘记链接到 boost_system 而我没有。

最佳答案

Ubuntu 隐式地将 --as-needed 传递给链接器。这会导致库的顺序很重要,即使对于共享库也是如此:如果命令行上在其之前列出的任何对象都没有使用该库,则该库将被丢弃。在 target_link_libraries 中的 boost 之前列出 dominion 可能会有所帮助。

关于c++11 - gcc 4.9.2 的 Boost 1.57 文件系统/系统链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26967332/

相关文章:

c++ - 您应该如何为自定义类实现 STL 功能?

c++ - 为什么要创建 register 关键字?

c++ - boost::asio::high_resolution_timer 用法示例?

C++函数调用顺序(boost)——困惑

c++ - 为什么 boost::filesystem::path 和 std::filesystem::path 的路径转义字符不同?

c++ - 强制模板参数类继承自另一个具有部分实现参数的模板化类

c++ - 在共享内存中的 boost 图中插入 boost vector

c++ - 如何使用 C++ 获取文件夹/目录名称,但不是一个文件的路径?特别是 boost::filesystem;

c++ - 使用 boost::filesystem 扩展用户路径

java - 隐藏实现细节是封装还是抽象?