【问题标题】:Application crash when using library from the program compiled with make使用 make 编译的程序中的库时应用程序崩溃
【发布时间】:2017-05-06 15:13:31
【问题描述】:

我正在用 C++ 的命令行制作科学计算器,以供我使用和练习。我在 Windows 上使用 cmake 和 mingw 编译它时遇到问题。这些是我的源文件:

main.ccp

#include <iostream> 
#include <string>

#include "ExpressionCalculations/ExpressionParser.h"

int main()
{
   std::string humanReadableExpression;
   std::cout<<"Enter expression\n";
   std::getline(std::cin, humanReadableExpression);
   std::cout<<humanReadableExpression;
   ExpressionCalculations::ExpressionParser parser;
   auto&& expression = parser.GenerateRpnExpression(humanReadableExpression);
   return 0;
}

ExpressionParser.h

#pragma once
#include <memory>
#include <stack>
#include <string>
#include <unordered_map>

namespace ExpressionCalculations
{

    class ExpressionParser
    {
        public:
            std::unique_ptr<std::string> GenerateRpnExpression(std::string &humanReadableExpression);
        private:
            // other code
};

}

ExpressionParser.cpp

#include <memory>
#include <stack>
#include <string>
#include <unordered_map>
#include <iostream>

#include "ExpressionParser.h"

namespace ExpressionCalculations
{
std::unique_ptr<std::string> ExpressionParser::GenerateRpnExpression(
    std::string& humanReadableExpression)
{
    std::unique_ptr<std::string> rpnExpression;
    *rpnExpression="3456";

    return rpnExpression;
}

这些是 cmake 文件

主 CMakeLists.txt

cmake_minimum_required (VERSION 2.8)
project (ScientificCalculator_exe)
add_subdirectory(ExpressionCalculations)

add_executable(ScientificCalculator main.cpp)

target_link_libraries(ScientificCalculator ExpressionCalculations)

模块 CMakeList.txt

set(calculators ExpressionParser.h ExpressionParser.cpp)

add_library(ExpressionCalculations ${calculators})

当我运行它时,我可以看到 Enter 表达式并传递输入。然后我得到分段错误。但是,当我删除 ExpressionParser 和 auto&& 表达式的声明时,会显示字符串,可以输入字符串并在命令中显示。我检查了配置问题multiple directories under cmakehttps://cmake.org/cmake-tutorial/https://www.codeproject.com/Articles/1181455/A-CMake-tutorial-for-Visual-Cplusplus-developers,但似乎我正确地制作了 cmake 文件。我不知道为什么它不起作用。我在 windows 上使用最新的 mingw64 和默认的 make 编译参数。

【问题讨论】:

    标签: c++ cmake mingw


    【解决方案1】:

    来自 unique_ptr 上的cppreference page

    该类满足 MoveConstructible 和 MoveAssignable 的要求,但不满足 CopyConstructible 或 CopyAssignable 的要求。

    在您的ExpressionParser::GenerateRpnExpression 函数中,当您应该移动它时,您正试图将 unique_ptr 从函数中复制出来。试试return std::move(rpnExpression)

    【讨论】:

      【解决方案2】:

      在调试只用 g++ 编译的程序后,我发现了问题。这是对 unique_ptr 的默认构造函数行为的误解。我认为它会初始化 std::string 但在阅读文档并检查它之后它不会初始化对象并生成 nullptr。然后我研究了 Scott Myers 的 Modern Effective C++ 如何初始化 unique_ptr。而不是std::unique_ptr&lt;std::string&gt; rpnExpression;,我使用auto rpnExpression = std::make_unique&lt;std::string&gt;();。它就像魅力一样。我通过cmake检查编译,没有任何问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多