Error linking boost with Visual Studio and vcpkg
Asked Answered
S

1

8

I am trying to accomplish a simple task in order to check how easy is to develop "Linux apps" in Windows.

I am using vcpkg from Microsoft in order to setup headers and libs and crow , an c++ http server that uses boost as a driver project

The source is simple

#include "crow.hpp"

int main()
{
    crow::SimpleApp app;

    CROW_ROUTE(app, "/")
        ([]() {
        return "Hello world!";
    });

    app.port(18080).run();
}

I have downloaded boost via vcpkg and used Visual Studio to code the project

cmake:

cmake_minimum_required (VERSION 3.8)
find_package(boost COMPONENTS  filesystem system thread date_time REQUIRED)
message("this is ${Boost_INCLUDE_DIRS}")
include_directories ("C:\\github.com\\crow\\include")
include_directories(SYSTEM PUBLIC ${Boost_INCLUDE_DIRS})

add_executable (engine "promo-engine-windows.cpp" "promo-engine-windows.h")

target_link_libraries(engine  ${Boost_LIBRARIES})

CMakeSettings.json

{
  "configurations": [
    {
      "name": "x86-Debug",
      "generator": "Visual Studio 15 2017",
      "configurationType": "Debug",
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-m -v:minimal",
      "variables": [
        {
          "name": "CMAKE_TOOLCHAIN_FILE",
          "value": "C:\\github.com\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake"
        }
      ]
    }
  ]
}

Linking gives errors:

error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::system::error_category const & __cdecl boost::system::system_category(void)" (__imp_?system_category@system@boost@@YAABVerror_category@12@XZ) referenced in function "public: __thiscall boost::system::error_code::error_code(void)" (??0error_code@system@boost@@QAE@XZ) 

error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (__imp_?generic_category@system@boost@@YAABVerror_category@12@XZ) referenced in function "public: virtual bool __thiscall boost::system::error_category::std_category::equivalent(class std::error_code const &,int)const " (?equivalent@std_category@error_category@system@boost@@UBE_NABVerror_code@std@@H@Z) 

error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall boost::gregorian::greg_month::greg_month(unsigned short)" (__imp_??0greg_month@gregorian@boost@@QAE@G@Z) referenced in function "public: __thiscall boost::gregorian::date::date(enum boost::date_time::special_values)" (??0date@gregorian@boost@@QAE@W4special_values@date_time@2@@Z) 

error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall boost::gregorian::greg_month::operator unsigned short(void)const " (__imp_??Bgreg_month@gregorian@boost@@QBEGXZ) referenced in function "public: static unsigned int __cdecl boost::date_time::gregorian_calendar_base<struct boost::date_time::year_month_day_base<class boost::gregorian::greg_year,class boost::gregorian::greg_month,class boost::gregorian::greg_day>,unsigned int>::day_number(struct boost::date_time::year_month_day_base<class boost::gregorian::greg_year,class boost::gregorian::greg_month,class boost::gregorian::greg_day> const &)" (?day_number@?$gregorian_calendar_base@U?$year_month_day_base@Vgreg_year@gregorian@boost@@Vgreg_month@23@Vgreg_day@23@@date_time@boost@@I@date_time@boost@@SAIABU?$year_month_day_base@Vgreg_year@gregorian@boost@@Vgreg_month@23@Vgreg_day@23@@23@@Z) 

fatal error LNK1120: 4 unresolved externals 

Build failed

Does it ring a bell to anyone? I am struggling hours with this.

Shatter answered 22/6, 2018 at 8:23 Comment(2)
have you tried changing your cmake file to exactly match github.com/Microsoft/vcpkg/blob/master/ports/boost/usage? e.g. in find_package the packaage name should be Boost not boost, adding REQUIRED would make it fail if boost isn't found (this could be your problem? cmake is not finding boost and silently ignoring it)Jill
@AlanBirtles your comment was enough to resolve my problem. Please answer the question if you are interested to get the bountyShatter
J
5

You should change your cmake file to exactly match https://github.com/Microsoft/vcpkg/blob/master/ports/boost/usage.

e.g. in find_package the package name should be Boost not boost, adding REQUIRED would make it fail if boost isn't found, cmake is possibly not finding boost and silently ignoring it.

Jill answered 25/6, 2018 at 13:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.