Как решить ниндзя C ++ сборки и исполнения - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть проект C ++, основанный на CMake, который использует ниндзя. Он был собран и запущен с использованием eclipse для C / C ++. Моя текущая машина - ОС Ma c. Файл:

#include <iostream>
#include <exception>
#include <string>
#include <stdexcept>
#include <vector>
#include <cmath>
using namespace std;

class Server {
private:
    static int load;
public:
    static int compute(long long A, long long B) {
        load += 1;
        if(A < 0) {
            throw std::invalid_argument("A is negative");
        }
        vector<int> v(A, 0);
        int real = -1, cmplx = sqrt(-1);
        if(B == 0) throw 0;
        real = (A/B)*real;
        int ans = v.at(B);
        return real + A - B*ans;
    }
    static int getLoad() {
        return load;
    }
};
int Server::load = 0;

int main() {
    int T;
    cin >> T;
    while(T--) {
        long long A, B;
        cin >> A >> B;

        /* Enter your code here. */
                try{
            cout << Server::compute(A, B) << endl;
        } catch(invalid_argument e){
            cout << "Exception: A is negative" << endl;
        } catch(bad_alloc &e){
            cout << "Not enough memory" << endl;
        } catch(exception &e){
            cout << "Exception: ";
            cout << e.what() << endl;
        } catch(...){
            cout << "Other Exception" << endl;
        }
    }
    cout << Server::getLoad() << endl;
    return 0;
}

Информация о сборке:

cmake --build . -- -v
[1/2] /Library/Developer/CommandLineTools/usr/bin/c++    -O3 -DNDEBUG -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -MD -MT CMakeFiles/deleteme.dir/deleteme.cpp.o -MF CMakeFiles/deleteme.dir/deleteme.cpp.o.d -o CMakeFiles/deleteme.dir/deleteme.cpp.o -c ../../deleteme.cpp
[2/2] : && /Library/Developer/CommandLineTools/usr/bin/c++  -O3 -DNDEBUG -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/deleteme.dir/deleteme.cpp.o  -o deleteme   && :
Build complete (0 errors, 0 warnings):

Когда я запускаю:

Building in: 
cmake --build . -- -v
ninja: no work to do.
Build complete (0 errors, 0 warnings): 

Это не дает мне возможности ввести значения. Он просто пропускает все и заканчивает выполнение. Если я поместил cout в самом начале, то программа работает, как и ожидалось.

Почему это происходит?

Ps: полный путь к проекту был удален отсюда по соображениям безопасности. И да, мой проект был создан с именем deleteme.

Pss: я взял этот фрагмент из HackerRank для изучения, так что все должно быть в порядке. Я только добавил try / catch и вызов метода.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Вы путаете сборку вашей программы с выполнением вашей программы.

Когда вы запустите команду cmake --build . -- -v, cmake будет build ваш проект. Это означает, что он запустит соответствующие инструменты для компиляции и связывания вашей программы, в результате чего исполняемый файл с именем deleteme будет где-то в вашей директории сборки. Последующий вызов той же команды правильно сообщает, что никакой работы не требуется (поскольку вы, вероятно, не изменяли исходный код между вызовами). Чтобы было ясно, обычно это не запускает вашу программу, поэтому вы не получаете подсказки для ввода каких-либо значений.

Для запуска вашей программы, что, если я правильно понимаю, это то, что вы пытаетесь сделать, просто запустите исполняемый файл deleteme, созданный процессом сборки. Скорее всего, вы найдете этот исполняемый файл в каталоге сборки, то есть в каталоге, в котором вы выполнили команду cmake --build .. (В зависимости от структуры вашего проекта CMake вы также можете найти его в подкаталоге вашего каталога сборки.)

0 голосов
/ 12 марта 2020

Я понял, как это решить. Я не знаю, что вызвало это. Похоже, что ниндзя не нужен, если вы правильно настроили переменные окружения, связанные с вашим компилятором, внутри Eclipse.

После этого все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...