[英]C++ CMakeLists how to build dependencies only once?
我安装了一些库:
sudo apt-get install libomp-dev
sudo apt-get install libarmadillo-dev
sudo apt-get install libmlpack-dev
当我尝试在 eclipse 中构建/执行/调试应用程序时,它似乎再次构建了所有依赖项。 一个简单的程序需要很长时间。 CMakeLists.txt 中的依赖项:
find_package(OpenMP REQUIRED)
target_compile_options(${PROJECT_NAME} INTERFACE -fopenmp)
target_link_libraries(${PROJECT_NAME} PUBLIC OpenMP::OpenMP_CXX mlpack PUBLIC armadillo)
程序:
#include <iostream>
#include <mlpack/core.hpp>
#include <mlpack/methods/ann/layer/layer.hpp>
#include <mlpack/methods/ann/ffn.hpp>
using namespace std;
using namespace mlpack;
using namespace mlpack::ann;
int main(int argc, char **argv) {
cout << "Hello World." << endl;
return 0;
}
由于这些依赖项没有被修改,有没有一种方法可以避免每次我想执行/调试我的“hello world”时构建它们? 类似于:仅构建一次依赖项。 或者:仅当不存在时才构建(清理并构建)。
结果:
Building in: /home/ai/Documents/ai_projects/test1/build/default
cmake --build . --target all
Scanning dependencies of target Prueba_1
[ 50%] Building CXX object CMakeFiles/test1.dir/test1.cpp.o <-- It takes 40sec
[100%] Linking CXX executable test1
[100%] Built target test1
Build complete (0 errors, 0 warnings): /home/ai/Documents/ai_projects/test1/build/default
由于这些依赖项没有被修改,有没有一种方法可以避免每次我想执行/调试我的“hello world”时构建它们? 类似于:仅构建一次依赖项。 或者:仅当不存在时才构建(清理并构建)。
有点。 CMake 实际上并不是从头开始构建这些库,所以没有什么可以告诉它依赖关系的。 只是标题非常大,需要很长时间来处理。
但是,您通常可以使用预编译头作为解决方法。 试试这个:
cmake_minimum_required(VERSION 3.16)
# ...
target_precompile_headers(
${PROJECT_NAME}
PRIVATE
<iostream>
<mlpack/core.hpp>
<mlpack/methods/ann/layer/layer.hpp>
<mlpack/methods/ann/ffn.hpp>
)
这将作为单独的构建步骤预编译这些头文件,并通过命令行标志将结果包含到${PROJECT_NAME}
目标中的每个源文件中。 这对第一次构建没有帮助,但是在进行增量构建时,只要预编译头中的包含集没有改变,您应该会看到一些好处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.