【发布时间】: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 库正确添加了链接目录吗?使用 Boostthread库的首选方式是将其指定为 COMPONENTS:find_package(Boost COMPONENTS thread REQUIRED),请参见 that answer 示例。
标签: boost cmake g++ mingw fedora