12

I'm trying to build an application with boost library by creating a MSVC9.0 project files with CMake.

I get the following error:

Error 3 fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_44.lib'

Here is the CMake configuration

cmake_minimum_required(VERSION 2.8)
PROJECT( TestProject)
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
set(BOOST_ROOT "D:/boost_1_44_0")
set(Boost_USE_MULTITHREADED ON)
FIND_PACKAGE( Boost 1.44.0 REQUIRED unit_test_framework system)

INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${BOOST_ROOT})
LINK_DIRECTORIES(${LINK_DIRECTORIES} "D:/boost_1_44_0/stage/lib")


SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
SET(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
ADD_EXECUTABLE(testapp
main.cpp)

TARGET_LINK_LIBRARIES(testapp
${Boost_SYSTEM_LIBRARY}
)

SET_TARGET_PROPERTIES( testapp PROPERTIES DEBUG_POSTFIX "d" )

I have built boost for static and shared (debug and release) with following options.

bjam toolset=msvc  variant=debug   link=shared runtime-link=shared threading=multi --build-type=complete stage
bjam toolset=msvc  variant=release link=shared runtime-link=shared threading=multi --build-type=complete stage
bjam toolset=msvc  variant=debug   link=static runtime-link=static threading=multi --build-type=complete stage
bjam toolset=msvc  variant=release link=static runtime-link=static threading=multi --build-type=complete stage

I'm not sure what I'm missing in the configuration. Any suggestions? Thanks.

1
  • Thank you Charles for formatting the content.
    – harik
    Commented Jun 25, 2011 at 10:11

2 Answers 2

21

First of all, did you check if "'libboost_system-vc90-mt-gd-1_44.lib" really exists in your stage-dir "D:/boost_1_44_0/stage/lib"?

Second: the most common problem I used to have with Boost and CMake's find_package( Boost) was interference with the auto-linking. You could disable it by adding a definition to your compile flags

add_definitions( -DBOOST_ALL_NO_LIB )

but then you probably will need to specify if you want to link to the dynamic or static version

set( Boost_USE_STATIC_LIBS ON ) # or Off, depending on what you want
find_package( Boost 1.44.0 REQUIRED unit_test_framework system)

Of course, you could always check the generated visual studio files to see which link-libraries are actually added to your project.

7
  • 3
    It fixes the problem by adding "add_definitions(-DBOOST_ALL_NO_LIB)" Thanks, you made my day.
    – harik
    Commented Jun 25, 2011 at 10:05
  • 1
    Your welcome. Note that with auto-linking disabled you are responsible for correctly linking in dependencies. E.g. when you would be using boost_filesystem, you would need to add the dependency on boost_system by including it in your find_package() and in your target_link_libraries.
    – André
    Commented Jun 25, 2011 at 11:24
  • 1
    Is there a solution to make the auto-linking work? I am trying to push a big tree to junior developers and I need the build process to be fool proof.
    – Ravenwater
    Commented Oct 2, 2012 at 14:31
  • awesome! You have a typo, though, add_definitionS
    – quimnuss
    Commented Mar 27, 2013 at 16:50
  • @Ravenwater try --layout=versioned
    – user2288008
    Commented Aug 23, 2014 at 10:09
1

After many tries, I was able to compile a project with Boost on Windows. Here is the CMakeLists.txt source:

cmake_minimum_required (VERSION 2.6)

project (SendCommand)

include_directories(./)

set(BOOST_ROOT F:/boost_1_55_0/)
set(BOOST_INCLUDEDIR F:/boost_1_55_0/)
set(BOOST_LIBRARYDIR F:/boost_1_55_0/lib32-msvc-10.0/)

set(Boost_INCLUDE_DIRS F:/boost_1_55_0/)
set(Boost_LIBRARY_DIRS F:/boost_1_55_0/lib32-msvc-10.0/)

add_definitions(-DBOOST_ALL_NO_LIB)

set(Boost_USE_STATIC_LIBS        ON)
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)

find_package(Boost 1.55.0 REQUIRED COMPONENTS system thread)

include_directories(${Boost_INCLUDE_DIRS}) 
add_executable(SendCommand send_command.cpp ivdlp_packet.cpp) 
target_link_libraries(SendCommand ${Boost_LIBRARIES})

For more information, you can use a document I've written: https://docs.google.com/document/d/1nE7kYBRQAWbR4rGkMmA5-Hg88M9vS_kAjO4Tc9Rq5zU/pub

Not the answer you're looking for? Browse other questions tagged or ask your own question.