C++11 gcc 4.9.2的Boost 1.57文件系统/系统链接器错误
我正在构建一个api库,并将其用作unittest项目的共享库。api正在以以下方式执行一些调用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
#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