I am currently trying the boost "With an uninstalled build" variety:
# Boost Related
SET( BOOST_LIB_INSTALL_DIR ${BUILD_DIR}/ouput/lib CACHE STRING "" FORCE )
SET( BOOST_EXPORTS_INSTALL_DIR ${BUILD_DIR}/ouput/lib CACHE STRING "" FORCE )
SET( BOOST_INCLUDE_INSTALL_DIR ${BUILD_DIR}/ouput/include CACHE STRING "" FORCE )
#SET( BUILD_PROJECTS NONE CACHE STRING "" FORCE )
SET( BUILD_PROJECTS thread filesystem CACHE STRING "" FORCE )
add_subdirectory( ${THIRD_PARTY_SRC_DIR}/boost-cmake-1_41_0 ./boost )
reading: http://sodium.resophonic.com/boost-cmake/current-docs/exported_targets.html I find:
--snip--
Example¶
There is an unpacked boost in /home/troy/boost-1.41.0/src and built boost in directory /home/troy/boost/1.41.0/build. I have a program that builds from one file, main.cpp and uses boost threads. My CMakeLists.txt looks like this:
include_directories(
/home/troy/boost-1.41.0/src
/home/troy/boost-1.41.0/build/lib/Exports.cmake
)
add_executable(my_program main.cpp)
target_link_libraries(my_program boost_thread-mt-shared-debug)
--end snip--
The part I don't like was the boost_thread-mt-shared-debug where -share-debug needed to be specified. What if I switch to release?
When I try to link some boost libs to a test app:
TARGET_LINK_LIBRARIES( ${SQUARE_ME_TEST_APP}
${MATLAB_CUDA_MEX_NAME}
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
# boost_filesystem-mt-shared-debug
# boost_filesystem
)
3>Linking...
3>LINK : fatal error LNK1104: cannot open file 'libboost_filesystem-vc90-mt-sgd-1_41.lib'
Now except for hte 'lib" preceeding 'libboost_filesystem-vc90-mt-sgd-1_41.lib' as only:
boost_filesystem-vc90-mt-sgd-1_41.lib
boost_filesystem-vc90-mt-gd-1_41.lib
are build on my Win64 system which I am sure is a result of ${Boost_FILESYSTEM_LIBRARY}
What is the best way to link to boost libs? Except for the point what did I miss? :-) I am sure it has something to do with (from http://sodium.resophonic.com/boost-cmake/current-docs/exported_targets.html):
-snip-
The problem here is that the real name of the multithreaded, shared, debug library target is boost_thread-mt-shared-debug. I know this is confusing; much of this is an attempt to be compatible with boost.build.
If you are having trouble, have a look inside that file Exports.cmake. For each available target, you’ll see:
# Create imported target boost_thread-mt-shared-debug
ADD_LIBRARY(boost_thread-mt-shared-debug SHARED IMPORTED)
# Import target "boost_thread-mt-shared-debug" for configuration "Release"
SET_PROPERTY(TARGET boost_thread-mt-shared-debug APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
SET_TARGET_PROPERTIES(boost_thread-mt-shared-debug PROPERTIES
IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE "pthread;rt"
IMPORTED_LOCATION_RELEASE "/home/troy/Projects/boost/cmake/cmaketest/build/boost/lib/libboost_thread-mt-d.so.1.41.0"
IMPORTED_SONAME_RELEASE "libboost_thread-mt-d.so.1.41.0"
)
it is the name in the ADD_LIBRARY line that you pass to target_link_libraries().
-end snip-
my exports.cmake file (in trunk\build\dvip4-Win64\lib) shows:
-snip-
# Create imported target boost_thread-mt-shared
ADD_LIBRARY(boost_thread-mt-shared SHARED IMPORTED)
# Import target "boost_thread-mt-shared" for configuration "Debug"
SET_PROPERTY(TARGET boost_thread-mt-shared APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
SET_TARGET_PROPERTIES(boost_thread-mt-shared PROPERTIES
IMPORTED_IMPLIB_DEBUG "C:/projects/NIH2009/source/branches/trunk/build/dvip4-Win64/lib/Debug/boost_thread-vc90-mt-1_41.lib"
IMPORTED_LOCATION_DEBUG "C:/projects/NIH2009/source/branches/trunk/build/dvip4-Win64/bin/Debug/boost_thread-vc90-mt-1_41.dll"
)
# Import target "boost_thread-mt-shared" for configuration "Release"
SET_PROPERTY(TARGET boost_thread-mt-shared APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
SET_TARGET_PROPERTIES(boost_thread-mt-shared PROPERTIES
IMPORTED_IMPLIB_RELEASE "C:/projects/NIH2009/source/branches/trunk/build/dvip4-Win64/lib/Release/boost_thread-vc90-mt-1_41.lib"
IMPORTED_LOCATION_RELEASE "C:/projects/NIH2009/source/branches/trunk/build/dvip4-Win64/bin/Release/boost_thread-vc90-mt-1_41.dll"
)
-end snip-
but NO boost_filesystem which I presume has to do with:
SET( BUILD_PROJECTS thread filesystem CACHE STRING "" FORCE )
and the text:
-snip-
BUILD_PROJECTS¶
This is a semicolon-separated list of projects to be built, or "ALL" (the default) for all projects, or "NONE". Projects not appearing in this list (if list not "ALL") are ignored; no targets in this project will appear. Example:
BUILD_PROJECTS=thread;python
-end snip-
I also tried
SET( BUILD_PROJECTS "thread;filesystem" CACHE STRING "" FORCE )
Do I need to even specify BUILD_PROJECTS or is there a way to specify the dependency in either add_dependencies or in target_link_libraries? This may sound crazy, but a build system that supports a syntax of dependency checking and building only what I need. From what I can tell at the moment with my current level of understanding of CMake... CMake really sucks at this. Let me be clear
SET(SQUARE_ME_TEST_APP squaremetest )
ADD_EXECUTABLE( ${SQUARE_ME_TEST_APP} square_me_test.cpp )
SET( BOOST_DEPS system filesystem )
find_package( Boost REQUIRED COMPONENTS system filesystem NO_MODULE )
MESSAGE( "Boost_FILESYSTEM_LIBRARY = " ${Boost_FILESYSTEM_LIBRARY} )
TARGET_LINK_LIBRARIES( ${SQUARE_ME_TEST_APP}
${MATLAB_CUDA_MEX_NAME}
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
# boost_filesystem-mt-shared-debug
# boost_filesystem
)
#ADD_DEPENDENCIES( ${SQUARE_ME_TEST_APP} boost-cmake-1_41_0 )
ADD_DEPENDENCIES( ${SQUARE_ME_TEST_APP} boost_filesystem )
--
Brian J. Davis