【问题标题】:CMake MinGW fails to link boostCMake MinGW 无法链接提升
【发布时间】:2020-12-15 21:57:15
【问题描述】:

我一直在努力理解为什么 CMake 不再编译我的程序。我制作了一个用于交叉编译 Windows 的 C++ 程序的容器。环境:

  • Fedora 31
  • cmake3.17.4
  • x86_64-w64-mingw32-g++9.2.1
  • boost1.69

以下代码是我当前的cmake 工具链文件mingw

set(CMAKE_SYSTEM_NAME Windows)
set(TOOLCHAIN_PFX x86_64-w64-mingw32)

set(Boost_ARCHITECTURE -x64)
set(Boost_DEBUG ON)
set(Boost_INCLUDE_DIR /usr/${TOOLCHAIN_PFX}/sys-root/mingw/include)
set(Boost_LIBRARY_DIR /usr/${TOOLCHAIN_PFX}/sys-root/mingw/lib)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost 1.69 REQUIRED)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include -L/usr/local/lib")

set(CMAKE_C_COMPILER ${TOOLCHAIN_PFX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PFX}-g++)

set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PFX})

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

链接可执行文件时,构建过程中断。它产生:

/usr/lib/gcc/x86_64-w64-mingw32/9.2.1/../../../../x86_64-w64-mingw32/bin/ld: cannot find -lboost_thread-mt
/usr/lib/gcc/x86_64-w64-mingw32/9.2.1/../../../../x86_64-w64-mingw32/bin/ld: cannot find -lboost_log-mt
/usr/lib/gcc/x86_64-w64-mingw32/9.2.1/../../../../x86_64-w64-mingw32/bin/ld: cannot find -lboost_system

最让我震惊的是它曾经构建(环境没有做任何改变)并且boost是从RPM安装的。有趣的是,如果我省略了-lboost_thread-mt,它当然会报错。

【问题讨论】:

  • 所以,链接器说它找不到库boost_thread-mt。这个库在您的系统上的什么位置?你设置Boost_DEBUG。你检查过它关于图书馆位置的输出吗?工具链还有一些奇怪的地方: 1、find_package在工具链文件中很少被调用,应该是从CMakeLists.txt调用的。 2.目录/usr/local/include是指host系统包含目录。使用它进行交叉编译通常是错误的。 /usr/local/lib 也是如此。 3.选项-L不是compiler标志,所以不应该添加到CMAKE_CXX_FLAGS
  • 您正在使用 MinGW-w64 为 Windows 进行交叉构建。另一方面,您说 boost 是通过 RPM 安装的。你确定你已经为 Windows/MinGW-w64 安装了 Boost,并且安装的 RPM 版本不只是针对你的 Linux 平台吗?
  • 嘿,谢谢。当然,Boost_DEBUG 的存在是有原因的。 Boost 已正确安装,它的根目录是我指定 Boost_INCLUDE_DIR 的位置,因为仅 CMake 无法找到它。 /usr/local/include 的使用可能是错误的,但主机是一个 Docker 容器,仅用作构建环境,我在那里放置了一些本地构建的 deps。关于巡演第二次观察,确实如此,但我的CMakeLists 很长很乱,在工具链上操作更容易。另外,当我为 Linux 构建时,我没有问题。
  • @BrechtSanders 为MinGW 安装了偏离路线提升,是的
  • 您显示的调用 find_package(Boost) 没有 COMPONENTS 规范,因此 boost_thread-mt 不是此调用产生的。此调用也不会为 Boost 库添加链接目录。那么,boost_thread-mt 在您的CMakeLists.txt 中指定的位置在哪里?您确定为 Boost 库正确添加了链接目录吗?使用 Boost thread 库的首选方式是将其指定为 COMPONENTS:find_package(Boost COMPONENTS thread REQUIRED),请参见 that answer 示例。

标签: boost cmake g++ mingw fedora


【解决方案1】:

您正在覆盖许多应该由find_package() 正确设置的变量,例如Boost_LIBRARY_DIR

此外,您不使用 find_package 指定任何组件,这是标准方式,除非您只想使用 boost 的仅标头部分。

因此,您正在以不受支持/未指定的方式使用 find_package boost,这可能在过去偶然有效,但后来中断了。

在 Fedora 36 上肯定有效的是:

cmake_minimum_required(VERSION 3.0...3.22.1)
project(some_project CXX)

# work-around: FindBoost: Boost_ARCHITECTURE not detected on MinGW
# https://gitlab.kitware.com/cmake/cmake/-/issues/20587
if(MINGW)
    if (CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(Boost_ARCHITECTURE "-x64")
    else()
        set(Boost_ARCHITECTURE "-x32")
    endif()
endif()

# works with/without
set(Boost_USE_STATIC_LIBS ON)

# set(Boost_DEBUG ON)

set(Boost_USE_STATIC_LIBS ON)

find_package(Boost 1.54
    REQUIRED COMPONENTS
    system
    filesystem) # just an example, add what you need

add_executable(somebinary main.cc sometranslationunit.cc)
target_link_libraries(somebinary ${Boost_LIBRARIES})

构建:

mkdir build-cross
cd build-cross
mingw64-cmake -DCMAKE_BUILD_TYPE=Debug .. # or whatever build type
mingw64-make somebinary

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多