如何解决 Ninja c++ 构建和执行问题

How to resolve Ninja c++ build and execution

本文关键字:构建 c++ 执行 问题 Ninja 何解决 解决      更新时间:2023-10-16

我有一个基于CMake的C++项目,它使用Ninja。它是使用 eclipse for C/C++ 构建和运行的。我目前的机器是Mac OS。 该文件:

#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中获取了这个片段用于研究目的,所以应该没问题。我只添加了尝试/捕获和方法调用。

您将构建程序与运行程序混淆了。

当你运行命令cmake --build . -- -v时,cmake 将构建你的项目。这意味着它将启动适当的工具来编译和链接您的程序,这将在您的构建目录中的某个位置生成一个名为deleteme的可执行文件。 同一命令的后续调用会正确报告不需要执行任何工作(因为您可能没有在调用之间修改任何源代码(。 需要明确的是,通常这不会运行您的程序,这就是为什么您不会收到输入任何值的提示。

要运行您的程序,如果我理解正确的话,这就是您要执行的操作,只需运行构建过程生成的可执行deleteme即可。您很可能会在构建目录中找到此可执行文件,即运行cmake --build .命令的目录。(根据您的 CMake 项目结构,您还可以在生成目录的子目录中找到它。

我已经想出了如何解决这个问题。我不知道是什么原因造成的。如果您在 Eclipse 中正确配置了与编译器相关的环境变量,则看起来不需要 ninja。

这样做之后,一切正常。