Search code examples
c++visual-studio-2012booststatic-linking

MSVS 2012 Express - Boost - Linker error LNK2019


I'm trying to build a project that's using some functionality of the file system part of the Boost library and I keep getting linker errors.
I followed the Boost documentation to build it and it built successfully and then moved all the lib files from the stage directory to C:/boost/lib and the hpp files to C:/boost/include. I'm using Microsoft Visual Studio 2012 Express Edition. I've made sure to add the files (libboost_filesystem-vc110-mt-1_54.lib and libboost_system-vc110-mt-1_54.lib) in the properties page to the files that need to be linked in (I also tried it with the #pragma's explicitly). I tried both the .lib files containing gd and the ones that dont (the debugging ones and the ones that aren't for debugging).

My question is, how do I fix this? Did I build the files wrong? Did I specify some sort of linker property wrong?

Here's the errors (I omitted some to keep it short, if needed I can add them all):

Error   1   error LNK2019: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" (?system_category@system@boost@@YAAEBVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'native_ecat''(void)" (??__Enative_ecat@system@boost@@YAXXZ)  C:\Visual Studio 2012 Projects\MMS_Solution\MMS_Prj_FindFile\MMS_Prj_FindFile.obj   MMS_Prj_FindFile
Error   2   error LNK2019: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (?generic_category@system@boost@@YAAEBVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'errno_ecat''(void)" (??__Eerrno_ecat@system@boost@@YAXXZ)  C:\Visual Studio 2012 Projects\MMS_Solution\MMS_Prj_FindFile\MMS_Prj_FindFile.obj   MMS_Prj_FindFile
[...]
Error   5   error LNK2019: unresolved external symbol "public: class boost::filesystem::path __cdecl boost::filesystem::path::root_path(void)const " (?root_path@path@filesystem@boost@@QEBA?AV123@XZ) referenced in function main  C:\Visual Studio 2012 Projects\MMS_Solution\MMS_Prj_FindFile\MMS_Prj_FindFile.obj   MMS_Prj_FindFile
Error   6   error LNK2019: unresolved external symbol "public: class boost::filesystem::path __cdecl boost::filesystem::path::root_name(void)const " (?root_name@path@filesystem@boost@@QEBA?AV123@XZ) referenced in function main  C:\Visual Studio 2012 Projects\MMS_Solution\MMS_Prj_FindFile\MMS_Prj_FindFile.obj   MMS_Prj_FindFile
[...]
Error   18  error LNK1120: 17 unresolved externals  C:\Visual Studio 2012 Projects\MMS_Solution\x64\Debug\MMS_Prj_FindFile.exe  MMS_Prj_FindFile

Here's the linker options (if others are needed I can add them):

Linker -> General
Enabled Incremental Linking = Yes (/INCREMENTAL)
Ignore Import LIbrary = No
Register Output = No
Per-user Redirection = No
Additional Library Directories = C:\openssl\lib;C:\boost\lib
Link Library Dependencies = Yes
Use Library Dependency Inputs = No
Prevent Dll Binding =

Linker -> Input
All of these are blank except for
Additional Dependencies = ssleay32.lib;libeay32.lib;Ws2_32.lib;libboost_system-vc110-mt-1_54.lib;libboost_filesystem-vc110-mt-1_54.lib;%(AdditionalDependencies)

Here's the code:

//Boost Includes
#include <boost/filesystem.hpp>

//Boost linking because visual studio won't link it (ugh)
#pragma comment (lib, "libboost_system-vc110-mt-gd-1_54.lib")
#pragma comment (lib, "libboost_filesystem-vc110-mt-gd-1_54.lib")

//Normal Includes
#include <iostream>
#include <string>

namespace bfs = boost::filesystem;

int main(int argc, char* argv[])
{
std::vector<std::string> foundPaths;
bfs::directory_iterator eit;
for(bfs::directory_iterator it("."); it != eit; it++)
{
    if(!bfs::is_regular_file(it->status()))
        continue;

    bfs::path foundPath = it->path();
    foundPaths.push_back("Root name: " + foundPath.root_name().string() + "\n" +
                         "Root dir : " + foundPath.root_directory().string() + "\n" + 
                         "Root path: " + foundPath.root_path().string() + "\n" +
                         "Rel  path: " + foundPath.relative_path().string() + "\n" +
                         "Prnt path: " + foundPath.parent_path().string() + "\n" +
                         "File name: " + foundPath.filename().string() + "\n" +
                         "Stem     : " + foundPath.stem().string() + "\n" +
                         "Extension: " + foundPath.extension().string() + "\n");
}

    for(std::vector<std::string>::iterator it = foundPaths.begin(); it !=     foundPaths.end(); ++it)
    {
        std::cout << *it << std::endl;
    }
    return 0;
}

Solution

  • When building Boost, make sure that you're using the parameter "address-model=64" if you're building for 64 bit.
    It says in the documentation that your compiler should choose the right one if it is configured correctly but apparently mine was not and was building 32 bit binaries when I wanted 64 bit binaries.