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.

valiano
  • 16,433
  • 7
  • 64
  • 79
harik
  • 563
  • 2
  • 5
  • 16

2 Answers2

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.

André
  • 18,348
  • 6
  • 60
  • 74
  • 3
    It fixes the problem by adding "add_definitions(-DBOOST_ALL_NO_LIB)" Thanks, you made my day. – harik Jun 25 '11 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é Jun 25 '11 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 Oct 02 '12 at 14:31
  • awesome! You have a typo, though, add_definitionS – quimnuss Mar 27 '13 at 16:50
  • @Ravenwater try `--layout=versioned` –  Aug 23 '14 at 10:09
  • thank you very much, both cmake instructions did it for me. Now if you install the Boost binaries (gives both lib and dll), is there any reason that asking for static libs OFF would make VS not resolve external symbols ? – Kriegalex Apr 11 '17 at 10:01
  • I had to add `add_definitions( -DBOOST_ALL_NO_LIB )` *and* `add_definitions( -DBOOST_SYSTEM_NO_DEPRECATED )` -- [more info here](https://stackoverflow.com/a/30877725/3765905). – BoltzmannBrain May 02 '18 at 02:51
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

Fernando
  • 1,477
  • 2
  • 14
  • 33