c++ - Cmake 通过全名而不是明确地说短的来寻找 boost lib

标签 c++ visual-studio boost cmake bamboo

我正在开发一个使用 boost 编译库的项目。我想在 Bamboo 上运行回归。我的想法是在我的电脑上构建时使用系统路径中的 boost,在 bamboo 上构建时使用复制的 libboost_program_options.lib。我复制了 boost header 和 libboost_program_options,所以它们位于 CMAKE_SOURCE_DIR/boost 文件夹中。该库是使用 --layout=system 编译的,因此文件名为 libboost_program_options.lib。

这是我的 cmake 的样子

cmake_minimum_required (VERSION 3.4)
project (Project)

file(GLOB SOURCES src/*.cpp)

set (SOURCE_FILES main.cpp other.cpp)

if (WIN32)
    set (SOURCE_FILES ${SOURCE_FILES} many_other_windows.cpp )
endif (WIN32)

if (UNIX)
        set (SOURCE_FILES ${SOURCE_FILES} many_other_unix.cpp)
endif (UNIX)


set(Boost_USE_STATIC_LIBS ON)

# This is a hint for find_package to look for boost libs / includes in this dirs but it doesnt work
set(BOOST_INCLUDEDIR ${CMAKE_SOURCE_DIR}/boost)
set(BOOST_LIBRARYDIR ${CMAKE_SOURCE_DIR}/boost)

find_package(Boost 1.63.0 COMPONENTS program_options)

if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  set(TARGET_LINK_LIBRARIES ${Boost_LIBRARIES})

else()
  include_directories(${CMAKE_SOURCE_DIR})
  link_directories(${CMAKE_SOURCE_DIR}/boost)
  if (WIN32)
      set(TARGET_LINK_LIBRARIES libboost_program_options)
  endif (WIN32)
  if (UNIX)
      set(TARGET_LINK_LIBRARIES libboost_program_options.a)
  endif (UNIX)
endif()


add_executable (Project ${SOURCE_FILES})


if (WIN32)
    set(TARGET_LINK_LIBRARIES ${TARGET_LINK_LIBRARIES} shlwapi)
endif (WIN32)


target_link_libraries(Project ${TARGET_LINK_LIBRARIES})

部分visual studio项目文件

输入路径/project.vcxproj:

(...)
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;libboost_program_options.lib;shlwapi.lib</AdditionalDependencies>
(...)

以及链接器的调用

04-Apr-2017 17:58:28      D:\MIDDLEWARE\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:QUEUE /OUT:"D:\bamboo-home\xml-data\build-dir\AS-CA-W64\Project\bin\Release\Project.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"D:/bamboo-home/xml-data/build-dir/AS-CA-W64/PostCompilator/boost" /LIBPATH:"D:/bamboo-home/xml-data/build-dir/AS-CA-W64/PostCompilator/boost/Release" kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib libboost_program_options.lib shlwapi.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:"D:/bamboo-home/xml-data/build-dir/AS-CA-W64/Project/bin/Release/Project.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:/bamboo-home/xml-data/build-dir/AS-CA-W64/PostCompilator/bin/Release/Project.lib" /MACHINE:X64  /machine:x64 Project.dir\Release\main.obj

04-Apr-2017 17:58:28    LINK : fatal error LNK1104: cannot open file 'libboost_program_options-vc140-mt-1_64.lib' [D:\bamboo-home\xml-data\build-dir\AS-CA-W64\Project\build\Project\Project.vcxproj]
04-Apr-2017 17:58:28    Done Building Project "D:\bamboo-home\xml-data\build-dir\AS-CA-W64\Project\build\Project\Project.vcxproj" (default targets) -- FAILED.

注意在 cmake 中如何将短名称更改为带有编译器名称和版本的全名。

有人知道如何让 cmake 找到那个库吗? 有没有人有任何建议,我如何才能更好地使我的项目在我的两台电脑上都可以构建,并在系统路径中 boost ,就像在我想复制 lib 的 Bamboo 上一样?也许有人更好地了解如何将 boost 集成到我在 Bamboo 上的项目中

最好的问候

最佳答案

原因是 boost windows header 添加了一些自动查找 .lib 文件并自动填充其名称的编译指示。这就是导致 cmake 查找库全名“libboost_program_options-vc140-mt-1_64.lib”的原因。我通过添加解决了这个问题:

add_definitions(-DBOOST_ALL_NO_LIB) # disabling of auto filling boost libs names to versioned 

关于c++ - Cmake 通过全名而不是明确地说短的来寻找 boost lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43212885/

相关文章:

c++ - clang 静态分析器是否因从 unique_ptr 列表中弹出前面而感到困惑?

c++ - c++ 使用哪个单元测试框架?

c++ - boost 空 std::forward_list 的序列化

c++ - 在导致 undefined symbol 错误的示例代码上使用 Boost 库?

c++ - 使用 boost::algorithm::split 拆分字符串

c++ - 让浏览器打开带有 SW_HIDE 样式的新窗口?

visual-studio - 传输已发布文件时出现 ClickOnce 错误 "different computed hash than specified in manifest"

angular - 无法在 angular 6 .net core 2.1 中获取/出错

.net - Entity Framework POCO 模板丢失(我使用的是 Visual Studio 2010 Professional )

c++ - 惰性初始化缓存...如何使其成为线程安全的?