FindBoost.cmake static boost v.1.66.0 linkage issue on Windows
Target linkage with static boost libs (only latest v.1.66.0) on Windows fails with link errors similar to following:
LINK : fatal error LNK1104: cannot open file 'boost_filesystem.lib'
Target shoudn't link to 'boost_filesystem.lib' at all, since 'boost_filesystem.lib' is import dynamic lib. But only correct 'libboost_filesystem.lib' static lib was specified for the target.
Minimal sample with issue is attached. Used build cmd:
mkdir build && cd build && cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release
Partial output from cmake:
-- Boost version: 1.66.0
-- Found the following Boost libraries:
-- system
-- filesystem
-- Boost include dir: C:/Users/maxr/Miniconda3/Library/include
-- Boost libraries: C:/Users/maxr/Miniconda3/Library/lib/libboost_system.libC:/Users/maxr/Miniconda3/Library/lib/libboost_filesystem.lib
-- Boost libraries LIBS_TO_LINK: C:/Users/maxr/Miniconda3/Library/lib/libboost_system.libC:/Users/maxr/Miniconda3/Library/lib/libboost_filesystem.lib
Partial MSVC output:
Link:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:QUEUE /OUT:"C:\Work\findboost-test\cmake-latest\Release\testBoostFind.exe" /INCREMENTAL:NO /NOLOGO C:\Users\maxr\Miniconda3\Library\lib\libboost_system.lib C:\Users\Miniconda3\Library\lib\libboost_filesystem.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:"C:/Work/findboost-test/cmake-latest/Release/testBoostFind.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/Work/findboost-test/cmake-latest/Release/testBoostFind.lib" /MACHINE:X64 /machine:x64 testBoostFind.dir\Release\main.obj
LINK : fatal error LNK1104: cannot open file 'boost_filesystem.lib' [C:\Work\findboost-test\cmake-latest\testBoostFind.vcxproj]
Reproducible on latest CMAKE nightly build (cmake-3.10.20180203-ga2e98-win64-x64) findboost-test.zip
cmake_minimum_required(VERSION 3.2)
project(testBoostFind)
set(Boost_DEBUG TRUE)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS system filesystem REQUIRED)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
set(BOOST_STATIC_SYSTEM_LIBRARY ${Boost_SYSTEM_LIBRARY_DEBUG})
set(BOOST_STATIC_FILESYSTEM_LIBRARY ${Boost_FILESYSTEM_LIBRARY_DEBUG})
else()
set(BOOST_STATIC_SYSTEM_LIBRARY ${Boost_SYSTEM_LIBRARY_RELEASE})
set(BOOST_STATIC_FILESYSTEM_LIBRARY ${Boost_FILESYSTEM_LIBRARY_RELEASE})
endif()
include_directories(SYSTEM ${Boost_INCLUDE_DIR})
message(STATUS "Boost include dir: " ${Boost_INCLUDE_DIRS})
message(STATUS "Boost libraries: " ${Boost_LIBRARIES})
add_executable(testBoostFind main.cpp)
set(LIBS_TO_LINK ${BOOST_STATIC_SYSTEM_LIBRARY} ${BOOST_STATIC_FILESYSTEM_LIBRARY})
message(STATUS "Boost libraries LIBS_TO_LINK: " ${LIBS_TO_LINK})
target_link_libraries(testBoostFind ${LIBS_TO_LINK})
Edited by Brad King