使用gcc 4.9.2增加1.57文件系统/系统链接器错误

时间:2014-11-17 07:10:07

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

我正在构建一个api库并将其用作unittest项目的共享库。 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)

并使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上,我似乎无法找出原因。我一开始认为升级版本可能是错误的(ubuntu只提供了1.55,而我在Windows上使用的是1.57)所以我在linux上也建立了1.57,但错误仍然存​​在。还有boost bug与c ++ 11相关,但它已修复为1.57

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

1 个答案:

答案 0 :(得分:3)

Ubuntu隐式将--as-needed传递给链接器。这导致库的顺序很重要,即使对于共享库:如果在命令行之前列出的任何对象没有使用库,它将被丢弃。 <{1}}中的加速之前列出dominion可能有所帮助。