【发布时间】:2018-05-04 14:47:24
【问题描述】:
CMake 可以找到我安装的 boost 版本 (1.67.0),但每当我尝试链接库时,我都会得到大量“未定义的引用”。
这是我要运行的程序(boost 网站上的示例):
#include <boost/regex.hpp>
#include <iostream>
#include <string>
int main(int, char *[])
{
std::string line;
boost::regex pat("^Subject: (Re: |Aw: )*(.*)");
while(std::cin) {
std::getline(std::cin, line);
boost::smatch matches;
if(boost::regex_match(line, matches, pat)) {
std::cout << matches[2] << '\n';
}
}
return 0;
}
这是我的 CMake 脚本:
cmake_minimum_required( VERSION 3.5 )
project( REGEX )
set( BOOST_ROOT D:/Dev/boost/boost_1_67_0/boost_1_67_0 )
set( Boost_LIBRARY_DIR D:/Dev/boost/boost_1_67_0/boost_1_67_0/stage/lib )
set( Boost_USE_STATIC_LIBS ON )
set( Boost_USE_MULTITHREADED ON )
find_package( Boost REQUIRED )
include_directories( ${Boost_INCLUDE_DIRS} )
add_executable( regex ${PROJECT_SOURCE_DIR}/main.cxx )
target_link_libraries( regex ${Boost_LIBRARIES} )
我需要做什么才能成功地将 boost 库与 cmake 链接?
编辑: 我已经更改了脚本,所以现在它看起来像这样:
cmake_minimum_required( VERSION 3.5 )
project( REGEX )
set( BOOST_ROOT D:/Dev/boost/boost_1_67_0/boost_1_67_0 )
set( BOOST_INCLUDEDIR D:/Dev/boost/boost_1_67_0/boost_1_67_0/boost )
set( BOOST_LIBRARYDIR D:/Dev/boost/boost_1_67_0/boost_1_67_0/stage/lib )
set( Boost_USE_STATIC_LIBS ON )
set( Boost_USE_MULTITHREADED ON )
set( Boost_DEBUG ON )
find_package( Boost COMPONENTS regex REQUIRED )
include_directories( ${Boost_INCLUDE_DIRS} )
add_executable( regex ${PROJECT_SOURCE_DIR}/main.cxx )
target_link_libraries( regex ${Boost_LIBRARIES} )
启用 boost 调试后,我看到 cmake 没有任何目录可以搜索库,所以我尝试手动设置它。我刚刚安装了 3.11.1 版本的 CMake,但它仍然无法识别正则表达式库。
【问题讨论】:
-
您使用的是哪个 CMake 版本?看看这个 answer 到另一个线程是否有帮助。 3.11 之前的 CMake 无法处理 boost 1.66 中引入的新命名方案。
-
非常感谢您的建议,我会安装最新版本的cmake看看是否有效
-
为了使
CMake 3.11.0或3.11.1工作,您可能还需要在find_package调用Boost 之前将set(Boost_ADDITIONAL_VERSIONS "1.67.0")添加到CMakeLists.txt,因为Boost 1.67.0不包含在_Boost_KNOWN_VERSIONS附带的 FindBoost.cmake 文件的变量。 -
我刚刚这样做了,但它仍然给我同样的错误:“找不到以下静态 Boost 库:boost_regex”
-
您在进行这些更改后是否清除(删除)了 CMakeCache.txt?不这样做是一个常见的问题。你知道你可以从这个link 下载许多平台的预构建二进制文件吗? Boost 家伙提供了这些二进制文件。只是为了确保自己构建 Boost 的问题不是真正的问题。