CMake MinGW无法链接boost
我一直在努力理解为什么CMake不再编译我的程序。我为Windows编写了一个交叉编译C++程序的容器。环境:CMake MinGW无法链接boost,boost,cmake,g++,mingw,fedora,Boost,Cmake,G++,Mingw,Fedora,我一直在努力理解为什么CMake不再编译我的程序。我为Windows编写了一个交叉编译C++程序的容器。环境: 软呢帽31 cmake3.17.4 x86\u 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(Bo
- 软呢帽31
3.17.4cmake
9.2.1x86\u 64-w64-mingw32-g++
1.69boost
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\u thread-mt
,它当然会抱怨。因此,链接器说它找不到库boost\u thread-mt
。此库在您的系统上的位置?您可以设置Boost\u DEBUG
。您是否检查了其关于库位置的输出?工具链也有一些奇怪的地方:1<代码>查找包很少在工具链文件中调用,它应该从CMakeLists.txt
调用。2.目录/usr/local/include
指主机系统的include目录。使用它进行交叉编译通常是错误的。这同样适用于/usr/local/lib
。3.选项-L
不是编译器标志,因此不应添加到CMAKE\u CXX\u标志中。您正在使用MinGW-w64交叉构建Windows。另一方面,你说boost是通过RPM安装的。你确定你已经为Windows/MinGW-w64安装了Boost,而且RPM安装的版本不仅仅适用于你的Linux平台吗?嘿,谢谢。当然,Boost\u DEBUG
的存在是有原因的。Boost安装正确,它的根目录是我指定的Boost\u INCLUDE\u DIR
,因为CMake无法单独找到它。使用/usr/local/include
可能是错误的,但主机是一个Docker容器,它仅用作建筑环境,我在那里放置了一些本地构建的DEP。关于第二次观察,这是真的,但是我的CMakeLists
非常长而且凌乱,而且在工具链上更容易操作。另外,当我为Linux构建时,我没有任何问题。@Brechsanders off-course boost是为MinGW
安装的,是的,您显示的调用find\u package(boost)
没有组件规范,因此boost\u thread-mt
不是通过此调用生成的。此调用也不会为Boost库添加链接目录。那么,在CMakeLists.txt
中指定了boost\u thread-mt
?是否确实为Boost库正确添加了链接目录?使用Boost线程
库的首选方法是将其指定为组件:查找包(需要Boost COMPONENTS thread)
,请参见示例。因此,链接器表示它找不到库Boost\u thread-mt
。此库在您的系统上的位置?您可以设置Boost\u DEBUG
。您是否检查了其关于库位置的输出?工具链也有一些奇怪的地方:1<代码>查找包
很少在工具链文件中调用,它应该从CMakeLists.txt
调用。2.目录/usr/local/include
指主机系统的include目录。使用它进行交叉编译通常是错误的。这同样适用于/usr/local/lib
。3.选项-L
不是编译器标志,因此不应添加到CMAKE\u CXX\u标志中。您正在使用MinGW-w64交叉构建Windows。另一方面,你说boost是通过RPM安装的。你确定你已经为Windows/MinGW-w64安装了Boost,而且RPM安装的版本不仅仅适用于你的Linux平台吗?嘿,谢谢。当然,Boost\u DEBUG
的存在是有原因的。Boost安装正确,它的根目录是我指定的Boost\u INCLUDE\u DIR
,因为CMake无法单独找到它。使用/usr/local/include
可能是错误的,但主机是一个Docker容器,它仅用作建筑环境,我在那里放置了一些本地构建的DEP。关于第二次观察,这是真的,但是我的CMakeLists
非常长而且凌乱,而且在工具链上更容易操作。另外,当我为Linux构建时,我没有任何问题。@Brechsanders off-course boost是为MinGW
安装的,是的,您显示的调用find\u package(boost)
没有组件规范,因此boost\u thread-mt
不是通过此调用生成的。此调用也不会为Boost库添加链接目录。那么,在CMakeLists.txt
中指定了boost\u thread-mt
?是否确实为Boost库正确添加了链接目录?使用Boost线程
库的首选方法是将其指定为组件:查找包(需要Boost组件线程)
,请参见示例。