如何解决 Ninja c++ 构建和执行问题
How to resolve Ninja c++ build and execution
我有一个基于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。
这样做之后,一切正常。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 构建一个由C和C++文件组成的库
- llvm构建器向基本块添加终止符
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- 如何跨平台将二进制资源构建到程序中?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 如何解决 Ninja c++ 构建和执行问题
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 用CMake构建C++协议
- Mingw-64 在构建和安装后不会编译 openCV 代码