2014-01-10 4 views
7

У меня есть следующий код:Ошибки компоновщика при использовании boost :: filesystem?

#include <iostream> 
#include <boost\filesystem.hpp> 

int main(){ 
    const char* file_path = "my_path"; 
    std::cout << boost::filesystem::file_size(file_path) << std::endl; 
} 

и когда я строю я получаю следующие ошибки:

1>Main.obj : error LNK2019: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" ([email protected]@[email protected]@[email protected]@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'native_ecat''(void)" ([email protected]@[email protected]@YAXXZ) 
1>Main.obj : error LNK2019: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" ([email protected]@[email protected]@[email protected]@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'errno_ecat''(void)" ([email protected]@[email protected]@YAXXZ) 
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl boost::filesystem::path_traits::convert(char const *,char const *,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > &,class std::codecvt<wchar_t,char,int> const &)" ([email protected][email protected]@[email protected]@[email protected][email protected][email protected]@@[email protected][email protected]@@[email protected]@[email protected][email protected]@@Z) referenced in function "void __cdecl boost::filesystem::path_traits::dispatch<class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > &,class std::codecvt<wchar_t,char,int> const &)" ([email protected][email protected][email protected][email protected]@@[email protected][email protected]@@[email protected]@@[email protected]@[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected][email protected][email protected]@@[email protected][email protected]@@[email protected][email protected][email protected]@@Z) 
1>Main.obj : error LNK2019: unresolved external symbol "public: static class std::codecvt<wchar_t,char,int> const & __cdecl boost::filesystem::path::codecvt(void)" ([email protected]@[email protected]@@[email protected][email protected]@@XZ) referenced in function "public: __cdecl boost::filesystem::path::path<char const [1]>(char const (&)[1],void *)" ([email protected]@[email protected]@@[email protected][email protected]) 
1>Main.obj : error LNK2019: unresolved external symbol "unsigned __int64 __cdecl boost::filesystem::detail::file_size(class boost::filesystem::path const &,class boost::system::error_code *)" ([email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@Z) referenced in function "unsigned __int64 __cdecl boost::filesystem::file_size(class boost::filesystem::path const &)" ([email protected]@[email protected]@[email protected]@@Z) 

Я использую Visual Studio и я поставил дополнительный путь библиотеки для моего линкер включить "C:\Program Files\Boost\boost_1_54_0\stage\lib;". Я также установил путь включения, чтобы посмотреть C:\Program Files\Boost\boost_1_54_0;

Может ли кто-нибудь помочь? Мой код строит отлично, когда я использую boost :: algorithm, boost :: string и boost :: interprocess.

EDIT: это то, что мой сшивание, если сделано в командной строке выглядит следующим образом:

/OUT: "my_file_path"/МАНИФЕСТ/NXCOMPAT/PDB: "my_file_path" /DYNAMICBASE «kernel32.lib "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32 .lib "" odbccp32.lib "/ DEBUG/MACHINE: X64 /INCREMENTAL/PGD:" my_file_path "/ MANIFESTUAC:" level = 'asInvoker' uiAccess = 'false' "/ ManifestFile:" my_file_path "/ ERRORREPORT: PROMPT /NOLOGO/LIBPATH: «C: \ Program Files \ Boost \ boost_ 1_54_0 \ этап \ Lib " /TLBID: 1

+0

BTV, 'Главный()' 'всегда возвращает int' в соответствии со стандартом C++. –

+0

http://www.boost.org/doc/libs/1_55_0/more/getting_started/windows.html в разделе «Ссылка изнутри Visual Studio IDE» они устанавливают только дополнительный путь библиотеки для компоновщика ....? – user997112

+0

@ user007112: Я не знал о функции автоматической привязки. Возможно, вам нужно будет перестроить ... Были ли какие-либо другие сообщения об ошибках, например, о не найденных библиотеках или неправильных символах? –

ответ

1

Установите /VERBOSE флаг компоновщика (" Linker | Общий | Show Progress "=" Показать все сообщения о ходе выполнения (/ VERBOSE) "в среде IDE). Затем посмотрите на выход: в IDE он будет находиться в каталоге вывода сборки в файле с именем <project-name>.log.

Если есть ускоряйте поиск библиотеки файловой системы, убедитесь, что она существует, и если ее никто не ищет, вам нужно будет добавить соответствующий текст явно в входы компоновщика, как упоминал Dietmar Kühl в удаленном сообщении.

Кроме того, поскольку похоже, что вы создаете цель x64, убедитесь, что вы не пытаетесь установить ссылку на 32-битные библиотеки boost.

6

У меня было подобное неразрешенное внешнее здание в Visual Studio.
Решение заключалось в том, чтобы использовать wchar_t для обработки как встроенный.

1

Существует много причин, по которым может возникнуть эта ошибка. Причина часто скрывается в предупреждениях, которые следует или предшествует после ошибки. Фактическое сообщение об ошибке часто мало подсказывает. Например, мой сценарий показывает, что-то вроде ниже:

enter image description here

Я использую VSColorOutput плагин, цвета ошибки и предупреждения по-разному. Как вы можете видеть, подсказка отображается в предупреждающее сообщение, которое говорит,

warning LNK4272: library machine type 'X86' conflicts with target machine type 'x64' 

В основном это означает, что я скомпилированные библиотеки подталкивание для целевого x32, но проект ориентирован на x64.Таким образом, исправление было удалить папку сценической и запустите следующую команду:

b2 variant=debug,release link=static runtime-link=shared threading=multi --with-thread address-model=64 

Если вы не видите предупреждения как выше, то вы, возможно, захотите попробовать на включение VERBOSE режима для линкера в настройках проекта> Linker> Общий> Показать прогресс.

Некоторые другие причины могут появиться сообщение об ошибке:

  • Вы не компилируется установку Boost, вообще или не установлен путь в настройках проекта> Linker> Общие> Дополнительные каталоги библиотек. В этом случае вы можете получить сообщение:

    фатальным LNK1104 ошибка: не удается открыть файл «libboost_system-vc90-мт-Г.Д.-1_62.lib»

  • Еще одна причина, это может произойти в том, что подталкивания может быть сконфигурирован на вашем компьютере или проекте, чтобы не использовать имена, созданные автогенераторами. Это называется автоматической привязкой, которую Boost делает по умолчанию, и это означает, что вам не нужно явно указывать файлы .lib явно в параметрах проекта. Вместо этого Boost auto генерирует имя файла lib и добавляет его в компоновщик. Если это отключено, вы получите сообщение об ошибке. Его можно включить с помощью макроса BOOST_ALL_DYN_LINK на уровне проекта.

0

Это сработало для меня: я поставил #include boost/filesytem.hpp в верхней части своего кода, прежде чем ссылаться на другие заголовки.

Link errors: 
#include <iostream> 
#include <fstream> 
#include <stdio.h> 
#include <Windows.h> 

//quantlib 
#include <ql/quantlib.hpp> 

//boost 
#include <boost/timer.hpp> 
#include <boost/lexical_cast.hpp> 
#include <boost/filesystem.hpp> 
--------------------------------------------- 
No Link errors: 
#include <iostream> 
#include <boost/filesystem.hpp> 
#include <fstream> 
#include <stdio.h> 
#include <Windows.h> 

//quantlib 
#include <ql/quantlib.hpp> 

//boost 
#include <boost/timer.hpp> 
#include <boost/lexical_cast.hpp> 
0

ошибка линкера была решена путем добавления следующего до заголовка включает в себя:

define BOOST_SYSTEM_NO_DEPRECATED 
Смежные вопросы