假设我们有一个包含一些子目录的项目,并且需要在其子目录之一中生成 .cpp 和 .h 文件。事实是:如果我们在该目录中运行命令(不带 < 和 >),它会生成有效文件。
那么如何使用 cmake 来做同样的事情呢?
Cmake有add_custom_command,但它什么也不做,所以我们不能使用它。execute_process 更好,因为它运行一些东西,但是以错误的方式运行。
execute_process(COMMAND "protoc -I=\".\" --cpp_out=\".\" protocol.proto"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)
不幸的是,结果什么也没有,因为 cmake 无法正确运行命令,因此“protoc”打印“No such file or directory”。
添加/编辑:此execute_process调用位于CMakeLists.txt中,该txt与protocol.proto文件位于同一目录中
为什么它不能简单地运行这个命令?
按照此说明,我创建一个headerconfig.h.in包含#cmakedefine USE_MYLIB. 在我的main.cpp文件中我添加了#include headerconfig.h.in. 而且,我也CMakeLists.txt为此设置了文件。但是,我得到了这个:
error: invalid preprocessing directive #cmakedefine
Run Code Online (Sandbox Code Playgroud)
我做错了什么?是否由于某种原因cmake无法读取#cmakedefine预处理器?
我是 Ubuntu,我正在学习 cmake 和 make,只是尝试一个简单的例子。我有两个目录:src和build. 在 中src,我有三个文件:main.cpp、camera.hpp和CMakeLists.txt,其中(仅)包含以下文本:
add_executable(test main.cpp)
target_link_directory(/home/karnivaurus/Libraries)
target_link_libraries(test Camera)
Run Code Online (Sandbox Code Playgroud)
在 中/home/karnivaurus/Libraries,我有一个名为 的共享库libCamera.so,我想链接到它。我main.cpp使用这个库中的函数,这些函数在camera.hpp.
现在,在我的build目录中,我运行cmake ../src,然后运行make。但是,然后我收到链接器错误,告诉我库中的某些函数存在未定义的引用。如果我搜索 中的所有文件和子目录build,则没有提及libCamera.so.
但是,如果我删除文件target_link_directory中的行CMakeLists.txt,并在指定可执行文件时写入库的完整路径,即target_link_libraries(test /home/karnivaurus/Libraries/libCamera.so),它可以正常编译和链接。
为什么target_link_directory没有按预期工作?
我有一个带有下一个 post_build 命令的 CMake 项目:
add_custom_command(TARGET ncd_json
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/ncd.json
$<TARGET_FILE_DIR:ncd_json>/ncd.json
COMMENT "Copy ncd.json into binaries folder"
)
Run Code Online (Sandbox Code Playgroud)
ncd.json每次目标构建时都会复制。但我确实需要仅在更改时才复制此文件,即使目标已经构建,这是主要问题。
我认为这个问题不是CMake 副本的完全重复(如果原始文件发生更改)而是对其进行了补充。
这是我第一次手动构建库,所以我只是想验证一些东西。有时,我运行 Cmake 作为:
cmake -SOME_SWITCH=ON ..
Run Code Online (Sandbox Code Playgroud)
而且这个运行得相当快。然而,在那之后,我运行:
sudo make
Run Code Online (Sandbox Code Playgroud)
这需要很长时间(30-40 分钟)。
所以我的问题是,如果我在 CMake 之后再次执行以下操作:
cmake -SOME_SWITCH=ON -SWITCH2=ON ..
Run Code Online (Sandbox Code Playgroud)
我需要重新制作吗?如果是这样,有没有办法不必再次执行整个 make (即只编译新条目?)
谢谢!
我想使用 CMake 为非 C 项目生成 makefile。我不需要 C 编译器来构建我的项目。事实上,我的主机上没有安装C编译器。
我的CMakeLists.txt样子:
cmake_minimum_required (VERSION 2.6)
project (the_thing.html)
LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/cmake-pandocology")
INCLUDE(pandocology)
add_document(
TARGET the_thing
OUTPUT_FILE the_thing.html
SOURCES the_thing.md
)
Run Code Online (Sandbox Code Playgroud)
当我在 Windows 机器上运行 cmake 时:
$ mkdir dict && cd dist
$ cmake .. -G"Unix Makefiles"
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:2 (project):
No CMAKE_C_COMPILER could be found.
Tell CMake where to find the compiler by setting either the environment …Run Code Online (Sandbox Code Playgroud) 我必须在 Gradle 中针对不同的 ABI 使用不同的参数,如下所示:
externalNativeBuild {
cmake {
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64)$")
arguments "-UV_LIBRARY=src/main/cpp/libuv/lib/libuv_armv8.a"
else
arguments "-UV_LIBRARY=src/main/cpp/libuv/lib/libuv_armv7.a"
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Cmake 抛出错误
CMake Error: Could not find CMAKE_ROOT !!!
CMake has most likely not been installed correctly.
Modules directory not found in
CMake Error: Error executing cmake::LoadCache(). Aborting.`
Run Code Online (Sandbox Code Playgroud)
尝试了我能找到的所有方法来修复(创建安装路径的环境变量、重新安装、从源代码安装),但这些都不起作用,我也尝试在 bash 上运行它(我通常使用 zsh),但仍然没有结果
根据CMake的文档,我只需要写
project(${PROJECT_NAME} LANGUAGES CUDA CXX)
Run Code Online (Sandbox Code Playgroud)
当我想在一个项目中结合 CUDA 文件和本机 C++ 文件时。然后我不必再打电话cuda_add_executable()了,而是add_executable,CMake 应该自己解决所有问题。这很好用,除非我想为 C++ 代码指定一个标准(通过使用set(CMAKE_CXX_STANDARD 17))。然后我收到错误消息
Target requires the language dialect "CUDA17" (with compiler extensions), but CMake does not know the compile flags to use to enable it
Run Code Online (Sandbox Code Playgroud)
是否有替代解决方案,或者我应该回到find_package(CUDA)和cuda_add_executable?
我正在尝试 CMake 一个项目。我刚开始使用它,所以我想对于熟悉 CMake 的人来说一定很明显:在 main.c 所在的主文件夹中,我包括
#include "tensorflow/lite/micro/all_ops_resolver.h"
Run Code Online (Sandbox Code Playgroud)
找到了这个库。在文件 all_ops_resolver.h 中有一行:
#include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
Run Code Online (Sandbox Code Playgroud)
在 micro_mutable_op_resolver.h 文件中还有另一行:
#include <cstdio>
Run Code Online (Sandbox Code Playgroud)
现在这会触发 CMake 的错误:
> In file included from
> ../main/tensorflow/lite/micro/all_ops_resolver.h:19,
> from ../main/main.c:16: ../main/tensorflow/lite/micro/micro_mutable_op_resolver.h:18:10: fatal
> error: cstdio: No such file or directory #include <cstdio>
> ^~~~~~~~
> compilation terminated.`
Run Code Online (Sandbox Code Playgroud)
文件 stdio.h 将位于:
~/.espressif/tools/xtensa-esp32-elf/esp-2020r2-8.2.0/xtensa-esp32-elf/xtensa-esp32-elf/include
Run Code Online (Sandbox Code Playgroud)
这是在项目目录之外。我无法弄清楚应该进入哪个 CMakeLists.txt 以将编译器指向该文件夹。有人可以帮忙吗?