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

C++11 gcc 4.9.2的Boost 1.57文件系统/系统链接器错误,c++11,boost,boost-filesystem,gcc4.9,boost-system,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::filesys

我正在构建一个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)) {
         ...
    }
}
但我的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上运行良好,但在使用GCC4.9.2的linux上,我似乎不明白为什么。一开始我认为boost版本可能是错误的(ubuntu只提供1.55版本,而我在windows上使用的是1.57版本),所以我也在linux上构建了1.57版本,但错误仍然存在。还有一个与c++11相关,但它是用1.57修复的


我看过关于这个主题的类似问题,但人们大多忘记链接到boost_系统,而我没有。Ubuntu会根据需要将
隐式传递给链接器。这样做的效果是,库的顺序很重要,即使对于共享库也是如此:如果某个库没有被命令行中在它前面列出的任何对象使用,它将被丢弃。在
target\u link\u库中列出boost之前的
dominion
可能会有所帮助。

您是否尝试在链接行中列出boost之前的
dominion
?您也可以尝试将
-Wl,--no按需添加到LDFLAGS。非常感谢@marglisse,就这样。把统治权放在推进之前就成功了。我不知道订单是否重要。我希望我能标记一条评论作为答案..可能重复的
/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