Что вызывает следующую ошибку связывания с библиотеками boost c ?

#c #gcc #linker #cygwin

Вопрос:

Привет, я получаю ошибку связывания при компиляции моей программы с компилятором gcc на cygwin. Первое изображение представляет собой простой пример программы со страницы руководства по библиотекам файловых систем boost, где я включил файловую систему.hpp в папку boost. Ниже приведена картинка моей ошибки компоновщика, когда я пытаюсь скомпилировать с помощью следующей команды:

 g   -I C:/Users/Ejer/Desktop/c  Dep/boost_1_77_0 -I C:/Users/Ejer/Desktop/c  Dep/eigen-3.4.0 -L C:/Users/Ejer/Desktop/c  Dep/boost_1_77_0/stage/lib test.cpp -o ser
 

Здесь я пытаюсь скомпилировать свою программу test.cpp с помощью библиотек eigen и boost и установите путь включения, который они велят мне установить в качестве пути после того, как я построю библиотеку с помощью b2.exe. Я также связался с файлами lib для повышения. Я также пытался специально ссылаться на различные файлы файловой системы lib. Заранее спасибо

 #include <iostream>
#include <boost/filesystem.hpp>
using std::cout;
using namespace boost::filesystem;

int main(int argc, char* argv[])
{
  if (argc < 2)
  {
    cout << "Usage: tut3 pathn";
    return 1;
  }

  path p (argv[1]);

  try
  {
    if (exists(p))
    {
      if (is_regular_file(p))
        cout << p << " size is " << file_size(p) << 'n';

      else if (is_directory(p))
      {
        cout << p << " is a directory containing:n";

        for (directory_entryamp; x : directory_iterator(p))
          cout << "    " << x.path() << 'n';
      }
      else
        cout << p << " exists, but is not a regular file or directoryn";
    }
    else
      cout << p << " does not existn";
  }

  catch (const filesystem_erroramp; ex)
  {
    cout << ex.what() << 'n';
  }

  return 0;
}
 

введите описание изображения здесь

Комментарии:

1. Вы создали boost, используя тот же компилятор внутри cygwin? двоичные файлы msvc не будут работать.

2. Да, я запустил файл начальной загрузки с помощью gcc, а затем b2.exe внутри cygwin

3. Вы не предоставляете компилятору библиотеку файловой системы boost (только каталог, в котором ее можно найти). Посмотрите в каталоге C:/Users/Ejer/Desktop/c Dep/boost_1_77_0/stage/lib найдите библиотеку boost и файловой системы asa и добавьте ее в командную строку выше

4. Я уже пробовал это. Вот что я написал в своем вопросе

5. Я вижу, что в вашем вопросе вы не указали фактическую библиотеку для ссылки. Вы сообщили компилятору, где находятся заголовки, и компоновщику, где находятся библиотеки, но вы не связались с библиотекой файловой системы. Это не будет сделано автоматически, как в msvc с комментарием #pragma(lib, libname.lib).

Ответ №1:

Я получаю ошибку связывания при компиляции моей программы

Нет, не знаешь. Вы получаете ошибку связывания при связывании вашей программы, а не при ее компиляции.

Причина: вы не указали библиотеку ( -L C:/Users/.... указывает компоновщику, где искать библиотеки, а не на какие библиотеки ссылаться). Ваша командная строка должна выглядеть примерно так:

 g   -I ... -L ... test1.cpp -o ser -lboost_filesystem
 

Комментарии:

1. Я только что попытался сделать то, что вы сказали , со связыванием конкретной библиотеки, но я все равно получаю cannot find -llibboost_filesystem-vc142-mt-x32-1_77.lib collect2: error: ld returned 1 exit status , вот команда, которую я пробовал: g -I C:/Users/Ejer/Desktop/c /c Dep/boost_1_77_0 -L C:/Users/Ejer/Desktop/c /c Dep/boost_1_77_0/stage/lib/ -l libboost_filesystem-vc142-mt-x32-1_77.lib main.cpp -o ser

2.Библиотека @SamuelCadell должна появиться после main.cpp , а не до этого. eli.thegreenplace.net/2013/07/09/.… Также вы хотите -lboost_filesystem-vc142-mt-x32-1_77 , а не -l libboost_filesystem-vc142-mt-x32-1_77.lib