我正在构建一个 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 上我似乎不知道为什么。起初我以为 boost 版本可能是错误的(ubuntu 只提供 1.55,而我在 windows 上使用的是 1.57)所以我也在 linux 上构建了 1.57,但错误仍然存在。还有一个与 c++11 相关的boost 错误,但它已在 1.57 中修复
我看过关于这个主题的类似问题,但人们大多忘记链接到 boost_system 而我没有。