Целый день искал решение, но без радости.
У меня есть решение CMake с двумя проектами . Одна - статическая библиотека, которая ссылается на boost, а другая - исполняемый файл, который ссылается на boost и мою собственную статическую библиотеку. Проблема в том, что в Linux он отлично компилируется с gcc. Но в VS2008 я получаю следующий тип ошибок компоновщика только для program_options.
libboost_program_options-vc90-mt-gd-1_46_1.lib(options_description.obj) : error LNK2005: "public: class boost::program_options::options_description_easy_init & __thiscall boost::program_options::options_description_easy_init::operator()(char const *,char const *)" (??Roptions_description_easy_init@program_options@boost@@QAEAAV012@PBD0@Z) already defined in boost_program_options-vc90-mt-gd-1_46_1.lib(boost_program_options-vc90-mt-gd-1_46_1.dll)
Похоже, он связан как со статической библиотекой, так и с библиотекой dll ... но почему?
Итак, у меня есть каталог решения с CMakeFile вроде это:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT( BBlockTools )
SET( TopDir ${CMAKE_CURRENT_SOURCE_DIR} )
ADD_SUBDIRECTORY( Utilities )
ADD_SUBDIRECTORY( BBlockFixer )
А затем два каталога проектов. Утилиты - это статическая библиотека, которая создается следующим CMakeFile:
PROJECT( Utilities )
SET(Boost_USE_STATIC_LIBS ON)
FIND_PACKAGE(Boost COMPONENTS system program_options REQUIRED)
LINK_DIRECTORIES ( ${Boost_LIBRARY_DIRS} )
INCLUDE_DIRECTORIES ( ${Boost_INCLUDE_DIRS} )
SET( src_h Utilities.h )
SET( src_cpp Utilities.cpp )
ADD_LIBRARY( Utilities STATIC ${src_h} ${src_cpp} )
TARGET_LINK_LIBRARIES( Utilities
${Boost_SYSTEM_LIBRARY}
${Boost_PROGRAM_OPTIONS_LIBRARY}
${Boost_LIBRARIES}
)
И второй проект, созданный этим CMakeFile:
PROJECT( BBlockFixer )
SET(Boost_USE_STATIC_LIBS ON)
FIND_PACKAGE(Boost COMPONENTS system filesystem program_options REQUIRED)
LINK_DIRECTORIES ( ${BBlockTools_BINARY_DIR}/Utilities/Debug ${Boost_LIBRARY_DIRS} )
INCLUDE_DIRECTORIES ( ${TopDir} ${Boost_INCLUDE_DIRS} )
SET( src_cpp fixerMain.cpp )
ADD_EXECUTABLE( BBlockFixer ${src_cpp} )
TARGET_LINK_LIBRARIES( BBlockFixer
Utilities
${Boost_FILESYSTEM_LIBRARY}
${Boost_PROGRAM_OPTIONS_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_LIBRARIES}
)
Я новичок в CMake, поэтому я могу делать что-то очень плохое, но я действительно не могу понять, что продолжается. Я начал экспериментировать с VS Project (Fixer), например, удалив ссылку на вход program_options, которая устраняет проблему (пока я снова не запустил cmake). Но я думаю, что это не решение, поскольку, судя по тому, как это выглядит, по какой-то причине он связывается как с библиотекой dll, так и со статической библиотекой ... Я попытался удалить $ {Boost_PROGRAM_OPTIONS_LIBRARY} из BBlockFixer из TARGET_LINK_LIBRARIES и program_options из FIND_PACKAGE, но не помогло.
Из того, что я понимаю в CMake, мой BBlockFixer наследует ссылки на program_options из моей статической библиотеки, и все должно быть в порядке. Но откуда взялся этот boost_program_options-vc90-mt-gd-1_46_1.lib (boost_program_options-vc90-mt-gd-1_46_1.dll) связать с моим проектом?
Любая помощь будет оценена, потому что я в отчаянии. Это не может быть так сложно ...
PS. этот TopDir, который я установил, таков, что я могу включить файл .h из служебных программ. Но я уверен, что должен быть более чистый способ сделать это или?