Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Failed linking to boost library with CMake generated project file for MSVC9

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.

like image 566
harik Avatar asked Jun 24 '11 13:06

harik


2 Answers

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.

like image 58
André Avatar answered May 31 '23 15:05

André


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

like image 40
Fernando Avatar answered May 31 '23 14:05

Fernando