gpt4 book ai didi

c++ - CMake:Visual Studio 构建查找错误的库

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:48 24 4
gpt4 key购买 nike

我有一个项目使用 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_LIBSOFF并添加预处理器定义 -DBOOST_ALL_DYN_LINK . -DBOOST_ALL_DYN_LINK都将启用 __declspec(dllimport)在 boost header 中的声明上,并使自动链接功能(如果启用)依赖于 dll 而不是静态库。

请注意,某些 boost 库不提供静态链接和动态链接之间的选择,并且不会受到 -DBOOST_ALL_DYN_LINK 的影响。 .我没有尝试过,所以我不知道 CMake FindBoost 模块是否处理这个问题。

如果你想使用静态链接,设置Boost_USE_STATIC_LIBSON . 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com