我正在为一个使用 CMake 的大型 C++ 项目而苦苦挣扎。现在我正在尝试添加一个依赖项(一个预编译和安装的库),但我不确定添加的位置、包含的内容以及链接它的位置。
特别是,我想知道以下命令之间的区别:
include_directoriestarget_include_directorieslink_librariestarget_link_libraries另外,当我需要使用以下命令时:
find_package 和add_library我知道它与仅标头库等有关,但我找不到易于理解和简洁的解释。
另外,我应该如何处理以下情况:
包含的库需要例如 Boost,但核心项目不需要。如何避免使整个CMakeLists.txt文件和二进制文件膨胀,并且仍然使用预编译库?(我认为这也是这个问题的一部分)
我在 C++ 中见过很多这种情况,即开发人员向 CMake 中的库添加一个空源文件。这里有一个示例,其中有一个空源文件,可以在此处找到。\nCMake 文件包含这一行:
\n# build the library\nadd_library(${PROJECT_NAME} STATIC src/dependency-tracker.cc)\nRun Code Online (Sandbox Code Playgroud)\n仅当文件夹中没有其他源文件时才会出现这种情况src,因此该库将是“仅标头”。他们为什么这样做呢?
我指的目录结构:
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 okvis\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kinematics\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 implementation\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Transformation.hpp <- header only implementation\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 operators.hpp\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Transformation.hpp\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 dependency-tracker.cc <- empty source file\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 runTests.cpp\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 TestTransformation.cpp\nRun Code Online (Sandbox Code Playgroud)\n 这是非常基本的:我通常使用 Eigen3 进行数学运算,但需要使用 libtorch 进行网络前向传递。现在我想用torch::tensor我的 Eigen3 (或纯 C++ )中的数据填充array,但没有for循环。我怎样才能做到这一点?
这是带有循环的解决方案:
Eigen::Matrix<double, N, 1> inputEigen; // previously initialized
torch::Tensor inputTorch = torch::ones({1, N}); // my torch tensor for the forward pass
for (int i = 0; i < N; i++) {
inputTorch[0][i] = inputEigen[i]; // batch size == 1
}
std::vector<torch::jit::IValue> inputs;
inputs.push_back(inputTorch);
at::Tensor output = net.forward(inputs).toTensor();
Run Code Online (Sandbox Code Playgroud)
目前效果很好,但N可能会变得非常大,我只是在寻找一种方法来直接torch::tensor使用以前使用过的 C++设置我的底层数据array