Cmake 通过全名而不是明确表示的短名称寻找提升库
Cmake looking for boost lib by full name instead of explicitly said short one
我正在开发一个使用boost编译库的项目。我想在竹子上运行回归。我的想法是当我在我的电脑上构建时,从我的系统路径中使用 boost,在竹子上构建时使用复制的 libboost_program_options.lib。我复制了提升标题和libboost_program_options,因此它们位于CMAKE_SOURCE_DIR/提升文件夹中。该库是使用 --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 项目文件的一部分
类型路径/项目.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:MIDDLEWAREMicrosoft Visual Studio 14.0VCbinx86_amd64link.exe /ERRORREPORT:QUEUE /OUT:"D:bamboo-homexml-databuild-dirAS-CA-W64ProjectbinReleaseProject.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.dirReleasemain.obj
04-Apr-2017 17:58:28 LINK : fatal error LNK1104: cannot open file 'libboost_program_options-vc140-mt-1_64.lib' [D:bamboo-homexml-databuild-dirAS-CA-W64ProjectbuildProjectProject.vcxproj]
04-Apr-2017 17:58:28 Done Building Project "D:bamboo-homexml-databuild-dirAS-CA-W64ProjectbuildProjectProject.vcxproj" (default targets) -- FAILED.
请注意,在 cmake 中,短名称如何更改为具有编译器名称和版本的全名。
有人知道如何让 cmake 找到那个库吗? 有没有人建议我如何更好地使我的项目在我的两台电脑上都可以构建,并在系统路径中提升,就像在我想复制库的竹子上一样?也许有人有更好的主意,如何将boost集成到我的竹子项目中
此致敬意
原因是 boost windows 标头添加了一些编译指示,这些编译指示会自动查找自动填充其名称的 .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
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- QT在错误的班级中寻找空位
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 正在寻找C++不可变的hashset/hashmap
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 表示类模板C++空类型
- 寻找一种更好的方法来表示无符号字符数组
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- Cmake 通过全名而不是明确表示的短名称寻找提升库
- 寻找连接对象的字符串表示的惯用方法