- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个项目使用 CMake 在 Linux 和 Windows 平台上执行构建。该项目的某些组件需要一些 Boost 库。许多组件构建为共享库 (.dll/.so)。当我安装 Boost 时,我选择构建共享库。
问题是:
在Windows上运行CMake后,打开生成的VS解决方案并运行构建,依赖Boost的组件失败,出现找不到库的错误。例如:
LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc100-mt-gd-1_58.lib'
果然,Boost lib 目录中没有该名称的文件。该库有 共享库文件:boost_thread-vc100-mt-gd-1_58.dll
(和.lib
)。
我假设“lib...”变体代表一个静态库。当我指定不使用来自 Boost 的静态库时,为什么要查找它? Linux 端似乎没有问题。
以下是我的 CMakeLists.txt 文件的一些摘录:
项目级别:
...
# Set to use shared libraries from Boost.
set(Boost_USE_STATIC_LIBS OFF)
#set(Boost_USE_STATIC_RUNTIME OFF) <- I also tried with this uncommented - no difference
#set(Boost_DEBUG ON)
if(WIN32)
find_package(Boost 1.58 REQUIRED system thread date_time chrono)
elseif(UNIX)
find_package(Boost 1.58 REQUIRED)
endif()
include_directories(${Boost_INCLUDE_DIRS})
...
需要 boost 的组件:
set(source_files
...)
# Create library from source files.
add_library(lib_target SHARED ${source_files})
target_link_libraries(lib_target ${Boost_LIBRARIES})
看起来其他人也有相同(或类似)的问题: cmake can't find boost libraries because it looks for the wrong file names .我使用 link=shared
构建了我的 Boost。
最佳答案
问题是 Boost 使用了 link.exe 的自动链接功能,事实上为了在静态链接和动态链接之间进行选择,您需要设置一些预处理器定义。也就是说, header 仍将尝试引入静态库,除非您禁用自动链接或定义 -DBOOST_ALL_DYN_LINK
。 (或各种 -DBOOST_<WHATEVER>_DYN_LINK
预处理器定义。)
要禁用 boost header 的自动链接,请设置预处理器定义 -DBOOST_ALL_NO_LIB
.由于 CMake 已经负责查找库和设置标志,因此自动链接对于 CMake 真的不是很有用。但是,您不必禁用它即可使动态链接正常工作。
如果你想使用动态链接,那么设置Boost_USE_STATIC_LIBS
至 OFF
并添加预处理器定义 -DBOOST_ALL_DYN_LINK
. -DBOOST_ALL_DYN_LINK
都将启用 __declspec(dllimport)
在 boost header 中的声明上,并使自动链接功能(如果启用)依赖于 dll 而不是静态库。
请注意,某些 boost 库不提供静态链接和动态链接之间的选择,并且不会受到 -DBOOST_ALL_DYN_LINK
的影响。 .我没有尝试过,所以我不知道 CMake FindBoost 模块是否处理这个问题。
如果你想使用静态链接,设置Boost_USE_STATIC_LIBS
至 ON
. Boost header 默认使用静态链接,因此如果您需要静态链接,是否启用自动链接并不重要。
如果您想查看 Boost 的自动链接需要哪些库,请设置预处理器定义 -DBOOST_LIB_DIAGNOSTIC
或使用 FindBoost 模块的 ${Boost_LIB_DIAGNOSTIC_DEFINITIONS}"
.这将导致 header 在处理时输出它们要求的库的名称。
示例 CMakeLists.txt 片段:
set(Boost_USE_STATIC_LIBS OFF)
find_package(Boost 1.58 REQUIRED system thread date_time chrono)
set(source_files ...)
add_library(lib_target SHARED ${source_files})
target_compile_definitions(lib_target PRIVATE -DBOOST_ALL_NO_LIB -DBOOST_ALL_DYN_LINK)
target_include_directories(lib_target PRIVATE ${Boost_INCLUDE_DIRS})
target_link_libraries(lib_target PRIVATE ${Boost_LIBRARIES})
这是一个仅使用目标而不是设置定义和包含目录的更新示例:
find_package(Boost 1.67 REQUIRED system thread date_time chrono)
set(source_files ...)
add_library(lib_target SHARED ${source_files})
target_link_libraries(lib_target PRIVATE
Boost::disable_autolinking
Boost::dynamic_linking
Boost::boost Boost::system Boost::thread Boost::date_time Boost::chrono)
关于c++ - CMake:Visual Studio 构建查找错误的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32252016/
我想根据我使用的 visual studio 版本编译不同的东西,比如 #if VISUAL_STUDIO_VERSION > 2015 eventH?.Invoke(this, EventArgs.
在 Visual Studio 2010 中调试并将鼠标悬停在变量名称上时,我可以选择使用 3 种不同的内置可视化工具:文本、XML 和 HTML。 这是我所指的示例: 由于我越来越多地使用基于 JS
我将可视化编程语言理解为允许程序员在屏幕上操作图形(而不是文本)对象以构建功能的语言。 我在 C#、VB 等中看到的最接近的东西是 RAD 控件,但这只是组成 UI 和最简单的功能——甚至与语言本身无
我目前正在使用 Visual Studio 2015 来编程 ASP.NET Core 应用程序。我对安装 Visual Studio 2017 有以下疑问: 什么被认为是最佳实践和/或最干净的方法?
尝试从扩展和更新获取 Visual Studio 扩展时,出现以下错误:- 向 visualstudiogallery.msdn.microsoft.com/Services/VStudio/Exte
我已经开发了Windows服务,并且该服务正在我的帐户下在本地计算机上运行。当我尝试通过在Visual Studio 2008中将其作为一个过程附加该服务来调试该服务时,我得到“无法附加到该过程。 V
作为标准安装的一部分,Visual Studio Code 带有一个名为“Monokai Dimmed”的颜色主题。 有没有办法将它移植到 Visual Studio 2015?我检查了社区主题( h
Visual Studio Community Edition是否可以使用Visual Studio Online帐户上的存储库? 我一直为包含在Online帐户中的Visual Studio Onl
我正在使用文本可视化工具在 Visual Studio 中调试字符串变量。然而,似乎字符串中间的大部分不见了。这背后的原因是什么? 最佳答案 Visual Studio 中的 Text Visuali
我正在开始一个涉及使用多个 SDK 的新项目,包括: 英特尔凌动开发者 SDK 文本转语音 SDK(建议?) 某种网络摄像头和增强现实支持(建议?) 我目前有 2008,但我也可以安装 2010。是否
我想知道,如果我发送一个解决方案文件夹(它是用 visual studio C# 编写的),您可以在 visual studio for mac 中打开解决方案吗? 在visual studio 20
有没有办法在 Visual Studio Code 和 Visual Studio 中设置相同的快捷方式(而不必每次都手动更改它们)? 例如,我在 Visual Studio Code 中经常使用 A
我无法启用 实时可视化树 在 Visual Studio 2017 用于 UWP 应用程序 (C#)。这个工具在 VS2015 上工作,但在 VS2017 中从来没有为我工作过。它对我的 WPF 项目
我刚开始了解 Visual Studio Code。我想知道,我可以将 Visual Studio 替换为所有 .NET 开发相关的工作吗? 我可以节省 Visual Studio 许可的成本吗? V
我安装了具有有效许可证(Visual Studio 订阅)的 Visual Studio 2019 企业版(VS 2019 16.1.4),它运行良好。 突然之间,当我尝试打开项目或项目中的任何文件时
Visual Studio 2015 Pro 提供以下 错误 : error BC36716: Visual Basic 9.0 does not support implicit line cont
我正在我的 PC 中使用 .net Framework 2.0 和 Visual C#(Microsoft Visual Studio 2008)开发 Windows 应用程序。 完成我的项目后,我必
有什么方法可以在启动 VS 时禁用 VA X 并仅在需要时将其重新打开?因为它会导致一些滞后。我似乎在 VS 的选项或 VA 的选项中都找不到该选项。 最佳答案 持shift在 Visual Stud
我可以将 Visual Studio 命令提示符 与免费的 Visual C# Express 一起使用吗? Visual Studio 命令提示符 被引用 here : Run 'Visual St
这很容易成为 Visual Studio 历史上最烦人的“功能”之一,我不明白它为什么存在 -- 曾经 . 为什么 CodePlex 项目需要关心我使用的是什么版本的 Visual Studio? 在
我是一名优秀的程序员,十分优秀!