标签: cmakelists-options

EnableLanguage 之后未设置 CMAKE_C_COMPILER

除了 gcc 和 g++ 编译器之外,我还在 Windows 上安装了 CMake,我将变量添加到路径中,但仍然出现以下错误,您可以帮忙吗?

在此输入图像描述

-- Building for: NMake Makefiles
CMake Error at CMakeLists.txt:6 (project):
  Running

   'nmake' '-?'

  failed with:

   The system cannot find the file specified


CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!
See also "C:/Users/DEANHOS/Desktop/peer/cmake tutorial/codeAndTech/sample/CMakeFiles/CMakeOutput.log".

Run Code Online (Sandbox Code Playgroud)

c c++ gcc cmake cmakelists-options

24
推荐指数
1
解决办法
10万
查看次数

在 CLion 中,如何设置 CMakeLists.txt 选项值?

我正在尝试使用 CLion(最新版本 - 2019.3)来处理我的源存储库,该存储库已经使用了 CMake(即有一个CMakeLists.txt)。现在,该软件包有一些关于构建哪些目标的选项;默认情况下,它只构建一些测试,但如果您将选项设置为ON,则会编译并构建一堆测试。

不幸的是,我不太明白 CLion 在哪里可以让您为其生成的构建子目录设置 CMake 选项值。它真的强迫你使用默认值吗?还是我在主用户​​界面或首选项中遗漏了某些内容?

cmake buildconfiguration clion cmakelists-options

10
推荐指数
1
解决办法
3944
查看次数

在打开 cuda 后端的情况下配置 OpenCV cmake 构建时出现错误“CUDA 后端需要 cuDNN”

我的目标:

我的目标是配置一个支持 cuda、tesseract 和 QT 的 OpenCV 4.5.1-dev 版本而没有任何 cmake 错误..

我遇到的问题:

当我按下 cmake gui 上的配置按钮时,出现以下错误:

CMake Error at modules/dnn/CMakeLists.txt:39 (message):
  DNN: CUDA backend requires cuDNN.  Please resolve dependency or disable
  OPENCV_DNN_CUDA=OFF
Run Code Online (Sandbox Code Playgroud)

这是我收到的完整 cmake 日志消息:

Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19042.
Detected processor: AMD64
libjpeg-turbo: VERSION = 2.0.6, BUILD = opencv-4.5.1-dev-libjpeg-turbo
Could NOT find OpenJPEG (minimal suitable version: 2.0, recommended version >= 2.3.1). OpenJPEG will be built from sources
OpenJPEG: VERSION = 2.3.1, BUILD = opencv-4.5.1-dev-openjp2-2.3.1
OpenJPEG …
Run Code Online (Sandbox Code Playgroud)

c++ opencv cmake cmakelists-options

8
推荐指数
1
解决办法
1638
查看次数

如何将 cmake 变量转换为 C++ 代码中的字符串?

例如,在 CMakeLists.txt 中,我可以定义路径:

\n
add_definitions(-DMY_PATH="/my/path")\n
Run Code Online (Sandbox Code Playgroud)\n

在 C++ 代码中,我可以通过以下方式访问变量

\n
std::string my_path = MY_PATH\n
Run Code Online (Sandbox Code Playgroud)\n

这很好用。现在,如果我在 CMakeLists.txt 中定义一个变量,如下所示:

\n
add_definitions(-DMY_PATH=${CMAKE_BINARY_DIR})\n
Run Code Online (Sandbox Code Playgroud)\n

然后,我收到以下错误:

\n
error: expected primary-expression before \xe2\x80\x98/\xe2\x80\x99 token\n/home/user/development/include/helper.hpp:33:32: note: in expansion of macro \xe2\x80\x98MY_PATH\xe2\x80\x99\n       const std::string path = MY_PATH;\n                                ^~~~~~~\n<command-line>:0:10: error: \xe2\x80\x98home\xe2\x80\x99 was not declared in this scope\n/home/user/development/include/helper.hpp:33:32: note: in expansion of macro \xe2\x80\x98MY_PATH\xe2\x80\x99\n       const std::string path = MY_PATH;\n
Run Code Online (Sandbox Code Playgroud)\n

那么,为什么会有所不同呢?如何将 cmake 变量转换为 C++ 代码中的字符串?

\n

c++ makefile cmake cmakelists-options

5
推荐指数
1
解决办法
2016
查看次数

Cmake:如何链接多个库?

我正在使用 CMake 定义 C++ 可执行文件的编译。目标是使用 2 个第三方库:Open3D 和 OpenCV。我可以使用 包含两者之一target_link_libraries,但包含这两个结果会导致找不到 OpenCV 函数。

这是我目前的CMakeLists.txt

minimum_required(VERSION 3.20)
project(ORB_SLAM)

find_package(Open3D REQUIRED)
find_package(OpenCV REQUIRED)

set(CMAKE_CXX_STANDARD 20)
add_executable(ORB_SLAM src/main.cpp)

#target_link_libraries(ORB_SLAM ${Open3D_LIBRARIES})
target_link_libraries(ORB_SLAM ${OpenCV_LIBS})

# When printed, ${Open3D_LIBRARIES} = Open3D::Open3D
#               ${OpenCV_LIBS} = opencv_calib3d;opencv_core;...many more..;opencv_xphoto
Run Code Online (Sandbox Code Playgroud)

有了这个CMakeList.txt,我就可以成功使用OpenCV的功能了。通过使用注释掉的 Open3D target_link_libraries,我可以成功使用 Open3D 。当取消注释两者时,无论和target_link_libraries的顺序如何,它都无法找到 OpenCV 功能。如果我将两者都包含在一个. CMake 3.16.3 和 3.21.3 也会出现同样的错误。find_packagetarget_link_librariestarget_link_libraries(ORB_SLAM ${OpenCV_LIBS} ${Open3D_LIBRARIES})

错误如下:

/usr/bin/ld: CMakeFiles/ORB_SLAM.dir/src/main.cpp.o: in function `main':
/home/m/CLionProjects/ORB_SLAM/src/main.cpp:20: undefined reference to `cv::VideoCapture::VideoCapture(std::string const&, int)'
Run Code Online (Sandbox Code Playgroud)

对于代码

#include <opencv2/opencv.hpp> …
Run Code Online (Sandbox Code Playgroud)

c++ build cmake shared-libraries cmakelists-options

5
推荐指数
1
解决办法
503
查看次数

ModuleNotFoundError:没有名为“rospkg”的模块

我是 ROS 新手,

当我将 rospy 导入脚本文件 example.py 并运行它时遇到问题:它说:

Traceback (most recent call last):
  File "/home/nagarjunv/hk_ws/src/rvo/src/example.py", line 4, in <module>
    import rospy
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/__init__.py", line 49, in <module>
    from .client import spin, myargv, init_node, \
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/client.py", line 52, in <module>
    import roslib
  File "/opt/ros/melodic/lib/python2.7/dist-packages/roslib/__init__.py", line 50, in <module>
    from roslib.launcher import load_manifest  # noqa: F401
  File "/opt/ros/melodic/lib/python2.7/dist-packages/roslib/launcher.py", line 42, in <module>
    import rospkg
ModuleNotFoundError: No module named 'rospkg'
Run Code Online (Sandbox Code Playgroud)

我将以下内容导入到我的脚本文件中:第 4 行是 rospy

#!/usr/bin/env python3

import sys
import rospy
Run Code Online (Sandbox Code Playgroud)

这是我的 CmakeList: …

python ros rospy cmakelists-options

4
推荐指数
1
解决办法
3万
查看次数

如何使 CMakelists.txt 包含仅适用于一种操作系统的一些 *.c 和 *.h 文件?

我想包含一些仅适用于 Windows 操作系统的 *.c 和 *.h 文件。但我找不到在不创建另一个目标的情况下如何做到这一点的方法,这会导致错误

我想做这样的事情:

add_executable(${TARGET}
     main.cpp
     mainwindow.cpp
     mainwindow.h
     mainwindow.ui
if (WIN32)
     test.c
     test.h
endif()
)
Run Code Online (Sandbox Code Playgroud)

有什么方法可以做到这一点吗?

c c++ cmake cmakelists-options

3
推荐指数
1
解决办法
1490
查看次数

CMake 中 Clang++ 的“-rdynamic”选项的等价物是什么?

我正在尝试通过阅读 LLVM 文档来创建一种新的编程语言。其中一个文档是关于“Kaleidscope”的,这是一种玩具编程语言。(教程在这里: https: //releases.llvm.org/9.0.0/docs/tutorial/LangImpl01.html)。

教程中的所有代码都写在一个文件中,可以通过以下命令进行编译:

clang++ -g -O3 toy.cpp -I/usr/lib/llvm-10/include -std=c++14  \
-fno-exceptions -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS \
-L/usr/lib/llvm-10/lib \
-rdynamic \
-lLLVM-10 -o toy
Run Code Online (Sandbox Code Playgroud)

但是,我想通过 CMake 管理我的项目。CMakeLists.txt除了选项“-rdynamic”之外,我已将上面的大部分命令翻译成一个文件(随后附加)。有谁知道如何将此选项添加到我的CMakeLists.txt?提前致谢!

SET(CMAKE_CXX_COMPILER "/usr/bin/clang++")
INCLUDE_DIRECTORIES("/usr/lib/llvm-10/include")
LINK_DIRECTORIES("/usr/lib/llvm-10/lib")

SET(_GNU_SOURCE 1)
SET(__STDC_CONSTANT_MACROS 1)
SET(__STDC_FORMAT_MACROS 1)
SET(__STDC_LIMIT_MACROS 1)

# Project configuration
# omit something unrelated

FIND_PACKAGE(LLVM REQUIRED CONFIG)
TARGET_LINK_LIBRARIES(compiler LLVM-10)
Run Code Online (Sandbox Code Playgroud)

c++ cmake llvm clang++ cmakelists-options

3
推荐指数
1
解决办法
2130
查看次数

我可以控制 CMake 中 target_sources 的源排除吗?

我是 CMake 的新手,我想知道是否有可能target_sources()根据变量排除某些来源。

假设我在下面有这个

target_sources(myTarget
    PUBLIC
    PRIVATE
        myDir1/src/a.c
        myDir2/src/b.c
        myDir3/src/c.c      
    INTERFACE
)

target_include_directories(myTarget
    PUBLIC
    PRIVATE       
        myDir1/inc
        myDir2/inc
        myDir3/inc  
    INTERFACE
)
Run Code Online (Sandbox Code Playgroud)

我想根据名为 ie 的标志从 myDir3 中排除/包含源/目录myFlag。我怎样才能做到这一点?

target_sources(myTarget
    PUBLIC
    PRIVATE
        myDir1/src/a.c
        myDir2/src/b.c
        if(DEFINED myFlag)
           myDir3/src/c.c
        endif()
    INTERFACE
)

target_include_directories(myTarget
    PUBLIC
    PRIVATE        
        myDir1/inc
        myDir2/inc
        if(DEFINED myFlag)
           myDir3/inc  
        endif()
    INTERFACE
)
Run Code Online (Sandbox Code Playgroud)

cmake cmake-language cmakelists-options

1
推荐指数
1
解决办法
108
查看次数