Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake MinGW无法链接boost_Boost_Cmake_G++_Mingw_Fedora - Fatal编程技术网

CMake MinGW无法链接boost

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

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

  • 软呢帽31
  • cmake
    3.17.4
  • x86\u 64-w64-mingw32-g++
    9.2.1
  • boost
    1.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\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组件线程)
,请参见示例。