Ошибка LNK2019 / 2001 при компиляции проекта Boost, созданного из CMake в первый раз, но не во второй - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть проект, который использует Boost, с CMake для системы сборки.В первый раз, когда я пытаюсь скомпилировать ALL_BUILD после генерации CMake, происходит сбой при связывании с ошибкой LNK2019 и 2 ошибками LNK2001 - но если я сделаю какие-либо изменения в CMakeLists.txt (даже просто добавив пробел) и скомпилирую снова, онработает просто отлично.

Вот мой CMakeLists.txt (Обновлено) :

 project(OurProject)

 set(CMAKE_MFC_FLAG 2)

 file(GLOB_RECURSE sources
     *.c
     *.cpp
     *.cc)

 file(GLOB_RECURSE headers
     *.h
     *.hpp
     *.inl)

 file(GLOB_RECURSE resources
     *.rc)

 file(GLOB_RECURSE definitions
     *.def)

 set_source_files_properties(${resources} PROPERTIES LANGUAGE RC)

 add_library(OurProject SHARED ${sources} ${headers} ${resources} ${definitions})

 target_compile_options(OurProject
     PRIVATE
         -D_CRT_SECURE_NO_WARNINGS
         -DNO_WARN_MBCS_MFC_DEPRECATION
 )

 find_package(Boost REQUIRED COMPONENTS filesystem thread regex)

 add_subdirectory(../ourLib ourLib)

 target_link_libraries(OurProject
     PRIVATE
         ourLib
         Boost::regex
         Boost::filesystem
         Boost::thread
 )

И вот три ошибки, с которыми он сталкивается:

 LNK2019    unresolved external symbol "void __cdecl boost::throw_exception(class std::exception const &)" (?throw_exception@boost@@YAXAEBVexception@std@@@Z) referenced in function "public: __cdecl boost::detail::shared_count::shared_count<class boost::io::basic_altstringbuf<char,struct std::char_traits<char>,class std::allocator<char> > *,class boost::io::basic_oaltstringstream<char,struct std::char_traits<char>,class std::allocator<char> >::No_Op>(class boost::io::basic_altstringbuf<char,struct std::char_traits<char>,class std::allocator<char> > *,class boost::io::basic_oaltstringstream<char,struct std::char_traits<char>,class std::allocator<char> >::No_Op)" (??$?0PEAV?$basic_altstringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@io@boost@@VNo_Op@?$basic_oaltstringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@12@@shared_count@detail@boost@@QEAA@PEAV?$basic_altstringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@io@2@VNo_Op@?$basic_oaltstringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@42@@Z)
 LNK2001    unresolved external symbol "void __cdecl boost::throw_exception(class std::exception const &)" (?throw_exception@boost@@YAXAEBVexception@std@@@Z)
 LNK2001    unresolved external symbol "void __cdecl boost::throw_exception(class std::exception const &)" (?throw_exception@boost@@YAXAEBVexception@std@@@Z)

Обновление 2 : Списки CMake нашей библиотеки.include_guard (GLOBAL)

 project(ourLib)

 set(CMAKE_MFC_FLAG 2)

 add_library(ourLib
     src/ourLibSource.cpp
     include/ourLibHeader.h
 )

 target_include_directories(ourLib
     PUBLIC
         $<INSTALL_INTERFACE:include>
         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
     PRIVATE
         ${CMAKE_CURRENT_SOURCE_DIR}/src
 )

 target_compile_options(ourLib
     PUBLIC
         -D_AFXDLL
         -D_AFXEXT
     PRIVATE
         -D_CRT_SECURE_NO_WARNINGS
         -DNO_WARN_MBCS_MFC_DEPRECATION
 )
...