2017-05-06 4 views
0

Je suis en train de faire une calculatrice scientifique en ligne de commande en C++ pour mon utilisation et aussi pour la pratique. J'ai un problème avec la compilation en utilisant cmake avec mingw sur Windows. Ce sont mes fichiers source:Application crash lors de l'utilisation de la bibliothèque du programme compilé avec make

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; 
} 

Ce sont des fichiers CMake

principale CMakeLists.txt

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

add_executable(ScientificCalculator main.cpp) 

target_link_libraries(ScientificCalculator ExpressionCalculations) 

Module CMakeList.txt

set(calculators ExpressionParser.h ExpressionParser.cpp) 

add_library(ExpressionCalculations ${calculators}) 

Quand je cours, je peux voir Entrez expression et passer l'entrée. Ensuite, je reçois une erreur de segmentation. Toutefois, lorsque je supprime la déclaration d'ExpressionParser et l'expression & & automatique, la chaîne est affichée, une chaîne peut être entrée et affichée dans la commande. J'ai vérifié la question de configuration multiple directories under cmake, https://cmake.org/cmake-tutorial/ et https://www.codeproject.com/Articles/1181455/A-CMake-tutorial-for-Visual-Cplusplus-developers mais il semble que j'ai correctement fait des fichiers cmake. Je n'ai aucune idée de pourquoi ça ne marche pas. J'utilise le dernier mingw64 sur Windows avec les paramètres de compilation par défaut.

Répondre

0

Après le programme de débogage compilé avec juste g ++ j'ai trouvé le problème. C'était une mauvaise compréhension du comportement du constructeur par défaut unique_ptr '. Je pensais qu'il allait initialiser std :: string mais après avoir lu doc ​​et l'avoir vérifié il n'initialise pas l'objet et génère nullptr. Ensuite, j'ai regardé dans Modern Effective C++ de Scott Myers comment initialiser l'unique_ptr. Au lieu de std::unique_ptr<std::string> rpnExpression; j'ai utilisé auto rpnExpression = std::make_unique<std::string>();. Cela fonctionne comme le charme. J'ai vérifié la compilation via cmake et il n'y avait pas de problèmes.

0

De l'cppreference page sur unique_ptr:

La classe satisfait aux exigences de MoveConstructible et MoveAssignable, mais pas aux exigences de l'une ou CopyConstructible CopyAssignable.

Dans votre fonction ExpressionParser::GenerateRpnExpression, vous tentez de copier le paramètre unique_ptr de la fonction lorsque vous devez le déplacer. Essayez return std::move(rpnExpression)

+0

J'ai ajouté cette expression, mais l'erreur se produit toujours. –