Где находится boost :: filesystem :: last_write_time? - PullRequest
4 голосов
/ 03 декабря 2010

Это ошибка компоновщика, которую я получаю. Все остальное в моей поддержке boost :: filesystem. Я не понимаю, почему это не так. Я думал, что это проблема с бустом 1.40, поэтому я обновился до 1.44, и проблема остается. Я использую #define BOOST_FILESYSTEM_VERSION 3, но не вижу упоминания о том, что last_write_time не было предоставлено в этом случае. Кажется, что базовая реализация отсутствует, хотя часть API присутствует.

1>TestPruner.obj : error LNK2019: unresolved external symbol "void __cdecl boost::filesystem3::detail::last_write_time(class boost::filesystem3::path const &,long,class boost::system::error_code *)" (?last_write_time@detail@filesystem3@boost@@YAXABVpath@23@JPAVerror_code@system@3@@Z) referenced in function "void __cdecl boost::filesystem3::last_write_time(class boost::filesystem3::path const &,long)" (?last_write_time@filesystem3@boost@@YAXABVpath@12@J@Z)

О да, используя Windows VS2008.

Используемый код:

time_t curTime = time(NULL);
bfs::last_write_time(bfs::path("TestData/PruneTest/completed/Batch001.DAT"), curTime);

Кто-нибудь еще сталкивался с этим?

И это также происходит с #define BOOST_FILESYSTEM_VERSION 2. Используемые мной библиотеки Boost от boostpro (предварительно, да, я ленивый)

2>TestPruner.obj : error LNK2019: unresolved external symbol "class boost::system::error_code __cdecl boost::filesystem2::detail::last_write_time_api(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,long)" (?last_write_time_api@detail@filesystem2@boost@@YA?AVerror_code@system@3@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@J@Z) referenced in function "void __cdecl boost::filesystem2::last_write_time<class boost::filesystem2::basic_path<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct boost::filesystem2::path_traits> >(class boost::filesystem2::basic_path<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct boost::filesystem2::path_traits> const &,long)" (??$last_write_time@V?$basic_path@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@Upath_traits@filesystem2@boost@@@filesystem2@boost@@@filesystem2@boost@@YAXABV?$basic_path@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@Upath_traits@filesystem2@boost@@@01@J@Z)

От / вербос: lib

Searching e:\Program Files\boost\boost_1_44\lib\libboost_thread-vc90-mt-gd-1_44.lib:
Searching e:\Program Files\boost\boost_1_44\lib\libboost_date_time-vc90-mt-gd-1_44.lib:

Ответы [ 2 ]

4 голосов
/ 03 декабря 2010

Хорошо, проблема настолько же проста, насколько и тупа.В VS2008 и выше time_t составляет 64 бита, если вы не #define _USE_32_BIT_TIME_T.Буст-библиотеки компилируются без этого определения, поэтому для них time_t составляет 64 бита.Мой проект из-за некоторых унаследованных проблем действительно определяет _USE_32_BIT_TIME_T и поэтому генерирует API с 32-битным временем.

Если вы создаете проект, который не использует 32-битное время, он работает как ожидалось.1005 * Я рад, что ребята из C ++ были достаточно умны, чтобы вставить подпись вызова в компоновщик с искажением имени.Если бы они этого не сделали, я бы по-прежнему задавался вопросом, что происходит.

0 голосов
/ 03 декабря 2010

Интересно, не столько ли это проблема с функцией, сколько с аргументами функции? Просматривая API boost :: filesystem, я не смог найти функцию last_write_detail с аргументами Path и time, только с аргументом Path. С другой стороны, я нашел

last_write_time_api( const std::string & ph, std::time_t new_value );

в отличие от

BOOST_FS_FUNC(std::time_t) last_write_time( const Path & ph )

Так что, возможно, ошибка в том, что компоновщик не может найти версию функции с правильной подписью, и вместо этого вам следует использовать last_write_time_api?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...