#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