繁体   English   中英

C++ CMakeLists 如何只构建一次依赖项?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM