微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Cmake 无法与 G++

如何解决Cmake 无法与 G++

设置环境

1.安装 CMake

cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5.tar.gz
tar xf cmake-3.14.5.tar.gz
cd cmake-3.14.5
./bootstrap --parallel=10
make -j4
sudo make -j4 install

2.安装 Boost

cd ~
wget https://boostorg.jfrog.io/artifactory/main/release/1.69.0/source/boost_1_69_0.tar.gz
tar xf boost_1_69_0.tar.gz
cd boost_1_69_0
./bootstrap.sh
./b2 ... cxxflags="-std=c++0x -stdlib=libc++" linkflags="-stdlib=libc++" ...
sudo ./b2 toolset=gcc -j4 install

CMakeLists.txt

# Defines AppBase library target.
project(recipe_01)
cmake_minimum_required(VERSION 3.5)

include(GNUInstallDirs)

set(CMAKE_EXPORT_COMPILE_COMMANDS "ON")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

if(CMAKE_CXX_STANDARD EQUAL 98 OR CMAKE_CXX_STANDARD LESS 14)
   message(FATAL_ERROR "app requires c++14 or newer")
elseif(NOT CMAKE_CXX_STANDARD)
   set(CMAKE_CXX_STANDARD 14)
   set(CMAKE_CXX_STANDARD_required ON)
endif()

find_package(Boost 1.60 required COMPONENTS regex)

add_executable(main main.cpp)

target_link_libraries(main Boost::regex)

main.cpp

#include <boost/regex.hpp>
#include <iostream>

int main() {
    // output the available regex Syntaxes
    std::cout
        << "Available regex Syntaxes:\n"
        << "\t[0] Perl\n"
        << "\t[1] Perl case insensitive\n"
        << "\t[2] POSIX extended\n"
        << "\t[3] POSIX extended case insensitive\n"
        << "\t[4] POSIX basic\n"
        << "\t[5] POSIX basic case insensitive\n"
        << "Choose regex Syntax: ";

    // correctly set up flags,according to the chosen Syntax
    boost::regex::flag_type flag;
    switch (std::cin.get()) {
    case '0': flag = boost::regex::perl;
        break;

    case '1': flag = boost::regex::perl|boost::regex::icase;
        break;

    case '2': flag = boost::regex::extended;
        break;

    case '3': flag = boost::regex::extended|boost::regex::icase;
        break;

    case '4': flag = boost::regex::basic;
        break;

    case '5': flag = boost::regex::basic|boost::regex::icase;
        break;
    default:
        std::cout << "Incorrect number of regex Syntax. Exiting... \n";
        return -1;
    }
    // disabling exceptions
    flag |= boost::regex::no_except;

    //requesting regex patterns in a loop
    // Restoring std::cin
    std::cin.ignore();
    std::cin.clear();

    //Getting a String to match: in a loop
    std::string regex,str;
    do {
        std::cout << "Input regex: ";
        if (!std::getline(std::cin,regex) || regex.empty()) {
            return 0;
        }

        // Without `boost::regex::no_except`flag this
        // constructor may throw
        const boost::regex e(regex,flag);
        if (e.status()) {
            std::cout << "Incorrect regex pattern!\n";
            continue;
        }

        std::cout << "String to match: ";
        while (std::getline(std::cin,str) && !str.empty()) {
            bool matched = boost::regex_match(str,e);
            std::cout << (matched ? "MATCH\n" : "DOES NOT MATCH\n");
            std::cout << "String to match: ";
        } // end of `while (std::getline(std::cin,str))`

        std::cout << '\n';

        // Restoring std::cin
        std::cin.ignore();
        std::cin.clear();
    } while (1);

    return 0;
} // int main()

构建

mkdir build
cd build
cmake ..
cmake --build .

我收到此错误

Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable bin/main
CMakeFiles/main.dir/main.cpp.o: In function `bool boost::regex_match<__gnu_cxx::__normal_iterator<char const*,std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*,std::allocator<char> > > > >,char,boost::regex_traits<char,boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*,__gnu_cxx::__normal_iterator<char const*,boost::match_results<__gnu_cxx::__normal_iterator<char const*,std::allocator<char> > > > > >&,boost::basic_regex<char,boost::cpp_regex_traits<char> > > const&,boost::regex_constants::_match_flags)':
main.cpp:(.text._ZN5boost11regex_matchIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISB_EEEcNS_12regex_traitsicns_16cpp_regex_traitsIcEEEEEEbT_SJ_RNS_13match_resultsISJ_T0_EERKNS_11basic_regexIT1_T2_EENS_15regex_constants12_match_flagsE[_ZN5boost11regex_matchIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISB_EEEcNS_12regex_traitsicns_16cpp_regex_traitsIcEEEEEEbT_SJ_RNS_13match_resultsISJ_T0_EERKNS_11basic_regexIT1_T2_EENS_15regex_constants12_match_flagsE]+0x8f): undefined reference to `boost::re_detail_106900::perl_matcher<__gnu_cxx::__normal_iterator<char const*,boost::cpp_regex_traits<char> > >::match()'
CMakeFiles/main.dir/main.cpp.o: In function `boost::basic_regex<char,boost::cpp_regex_traits<char> > >::assign(char const*,char const*,unsigned int)':
main.cpp:(.text._ZN5boost11basic_regexicns_12regex_traitsicns_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j[_ZN5boost11basic_regexicns_12regex_traitsicns_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j]+0x2a): undefined reference to `boost::basic_regex<char,boost::cpp_regex_traits<char> > >::do_assign(char const*,unsigned int)'
CMakeFiles/main.dir/main.cpp.o: In function `boost::re_detail_106900::perl_matcher<__gnu_cxx::__normal_iterator<char const*,boost::cpp_regex_traits<char> > >::perl_matcher(__gnu_cxx::__normal_iterator<char const*,std::allocator<char> 
> >,boost::regex_constants::_match_flags,std::allocator<char> > >)':
main.cpp:(.text._ZN5boost16re_detail_10690012perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISC_EEENS_12regex_traitsicns_16cpp_regex_traitsIcEEEEEC2ESC_SC_RNS_13match_resultsISC_SF_EERKNS_11basic_regexIcSJ_EENS_15regex_constants12_match_flagsESC_[_ZN5boost16re_detail_10690012perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISC_EEENS_12regex_traitsicns_16cpp_regex_traitsIcEEEEEC5ESC_SC_RNS_13match_resultsISC_SF_EERKNS_11basic_regexIcSJ_EENS_15regex_constants12_match_flagsESC_]+0x121): undefined reference to `boost::re_detail_106900::perl_matcher<__gnu_cxx::__normal_iterator<char const*,boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char,boost::regex_constants::_match_flags)'
collect2: error: ld returned 1 exit status
CMakeFiles/main.dir/build.make:84: recipe for target 'bin/main' Failed
make[2]: *** [bin/main] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/main.dir/all' Failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:83: recipe for target 'all' Failed
make: *** [all] Error 2

我无法使用 main 函数链接到 boost:regex 你能告诉我这个问题的解决方案吗?

我找到了一些类似的引用

boost 1.61(及更高版本)使用较新的编译器编译,这些编译器使用 _GLIBCXX_USE_CXX11_ABI=1 .. heh ABI。这意味着对于 -std=c++11 std::basic_string... 变为 std::__cxx11::basic_string...(对于 std::list 也是如此;请参阅 gcc Dual ABI 文档)。

由于您的链接错误声称缺少包含 std::string 的符号(它是 std::basic_string 的缩写),您要么使用编译器进行编译这太旧了并且使用 ABI 0,或者您甚至使用 -D_GLIBCXX_USE_CXX11_ABI=0 显式编译。

但是我该如何修复我的代码

解决方法

换行

target_link_libraries(main Boost::regex)

target_link_libraries(main boost_regex)

并且根据您的发行版,您可能需要安装一些 Boost 开发包。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。