cmake, boost :: ошибка связывания файловой системы (undefined directory_iterator.operator! =) - PullRequest
2 голосов
/ 27 февраля 2011

Я использую CMake (2.8.3), Boost :: filesystem (1.42.0) в Ubuntu 10.10. Код компилируется нормально, но я продолжаю получать следующую ошибку при линковке:

CMakeFiles/sample.dir/sample.cpp.o: In function `main':
sample.cpp:(.text+0x1af8d): undefined reference to `int operator!=<boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> > >(boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> > const&, boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> > const&)'
collect2: ld returned 1 exit status

Код, о котором идет речь, следующий:

#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>

int main()
{
  string folder;
  string extension;
  fs::directory_iterator end;

  folder    = ".";
  extension = ".zip";

  for (fs::directory_iterator i(folder); i != end; ++i)
  { if (fs::is_regular_file(i->status()))
    {
      if (boost::algorithm::ends_with(i->leaf(), extension))
      {
        cout << i->leaf() << " has extension .zip" << endl;
      }
    }
  }
}

в моем CMakeLists.txt файле, у меня есть:

find_package(Boost 1.4.0 COMPONENTS filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(executable
    ${Boost_LIBRARIES})

но я также пытался с:

set(Boost_USE_STATIC_LIBS        ON)
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost 1.4.0 COMPONENTS filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(executable
    ${Boost_FILESYSTEM_LIBRARY})

и многие другие комбинации вышеперечисленного.

Компоновщик жалуется на оператор != для типа directory_iterator. Если я посмотрю содержимое заголовка в /usr/include/boost/filesystem/path.cpp, то увижу, что там определен оператор Есть идеи, почему это происходит?

Я бы очень признателен за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

После добавления отсутствующих включаемых файлов:

#include <string>
#include <iostream>

и пространства имен (std), и определение макроса для этого ярлыка "fs" вашего кода:

#define fs boost::filesystem

Затем я попробовал первый упомянутый вами подход CMakeLists.txt, и он сработал ... У меня тоже такая же система, как и у вас.

Я бы порекомендовал использовать MESSAGE в CMake для проверки этих переменных $ Boost_ * и отладки с ним системы компиляции ...

0 голосов
/ 08 мая 2012

У меня была та же проблема, за исключением того, что мой компилятор (VS 2010) жаловался, что не было оператора! =, Который принимает левый операнд типа 'boost :: filesystem3 :: directory_iterator'. Оказалось, что мой конечный итератор объявлен так:

boost::filesystem::directory_iterator endDir();

Когда я убрал скобки, все скомпилировалось и связалось просто отлично. Я предполагаю, что компилятор интерпретировал исходную строку как функцию с именем endDir, которая возвратила directory_iterator, что все еще не вполне объясняет, почему он жаловался на левый операнд, а не на правый операнд.

Эта проблема была описана Скоттом Мейерсом как "1008 *" самый неприятный синтаксический анализ C ++.

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