天道酬勤,学无止境

cmake

Cmake override find_package for a given target

问题 我们有一个 CMakeLists.txt,它将(例如)opencv 链接到我们的各种二进制文件。 这是按如下方式完成的: find_package(OpenCV REQUIRED core imgproc highgui contrib) target_link_library(XXX opencv_core) 我们还希望允许构建库的人提供自己的 opencv 库。 似乎这可以通过将 -DCMAKE_PREFIX_PATH 设置为正确的路径来完成。 cmake -DCMAKE_PREFIX_PATH=".../mybuild/include;.../mybuild/lib" . 但是我想确保使用的库正是客户端指定的库(即,如果 /mybuild/lib 中没有任何内容,则配置失败)。 如何允许构建库的人覆盖使用的库? (如果没有指定它应该回退到 find_package-s) 回答1 简而言之 如果包提供<package>Config.cmake脚本,用户可以指定<package>_DIR CMake 变量来定位这个脚本。 在这种情况下,可以使用find_package()的NO_DEFAULT_PATH选项禁用搜索其他地方。 如果使用Find<package>.cmake脚本搜索包,如果用户提供了提示变量但它是错误的,则没有(通用)方法可以禁用搜索其他地方。 解释 首先,

2022-07-11 10:01:20    分类:技术分享    cmake

How to set the Maximum Path Length with CMAKE?

问题 如何使用 CMAKE 在变量中设置最大路径长度? 我知道如何从我的计算机上获取它: cabellos@ozzy:~$ getconf PATH_MAX / 4096 cabellos@ozzy:~$ getconf NAME_MAX / 255 但这仅适用于Linux,不是吗? 回答1 if(CMAKE_HOST_UNIX) execute_process( COMMAND getconf PATH_MAX / OUTPUT_VARIABLE OBJECT_PATH_MAX OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process( COMMAND getconf NAME_MAX / OUTPUT_VARIABLE OBJECT_NAME_MAX OUTPUT_STRIP_TRAILING_WHITESPACE) else() set(OBJECT_PATH_MAX 260) set(OBJECT_NAME_MAX 255) endif()

2022-07-11 09:34:07    分类:技术分享    cmake

How to compile with different compile options for different files in CMAKE?

问题 我有一个这样的项目: |--CMakeLists.txt(1) |--File1.cpp -W -W-all |--Folder1 |--CMakeLists.txt(2) |--File2.cpp -W -W-all -fno-rtti 正如您在上面看到的, File2.cpp需要使用-fno-rtti进行编译,而其他文件应该使用rtti进行编译。 发生这种情况是因为我在项目中同时使用了 clang 和 boost 库。 我这样写CMakeLists.txt(1) : SET (CMAKE_CXX_FLAGS "-std=c++11 -fexceptions -fno-rtti -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -Wno-long-long" ) 而且,在CMakeLists.txt(2)我添加了以下内容: add_definitions( -fno-rtti ) 以上没有奏效。 事实上,在 CMakeLists.txt(2) 中,以下所有内容均不适合我 set_property(SOURCE File2.cpp APPEND_STRING PROPERTY CMAKE_CXX_FLAGS " -fno-rtti ") set_property(SOURCE File2.cpp APPEND_STRING

2022-05-17 05:08:18    分类:技术分享    c++   boost   cmake   clang   rtti

No rule to make target 'C:/opencv/build/lib/libopencv_world300d.dll.a', needed by 'opencv.exe'. Stop

问题 所以我正在尝试构建一个简单的 opencv 代码,但我不断收到此错误,而且我似乎在互联网上找不到任何解决方案: 操作系统:Windows 8.1 编译器 GNU GCC 601 IDE:克莱恩 CMake 3.0 和 mingw64 这是我从 opencv 教程页面获得的代码 #include <stdio.h> #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char** argv ) { if ( argc != 2 ) { printf("usage: DisplayImage.out <Image_Path>\n"); return -1; } Mat image; image = imread( argv[1], 1 ); if ( !image.data ) { printf("No image data \n"); return -1; } namedWindow("Display Image", WINDOW_AUTOSIZE ); imshow("Display Image", image); waitKey(0); return 0; } 和 CMake 文件: cmake_minimum_required(VERSION 3.0) project(opencv)

2022-05-17 03:09:05    分类:技术分享    c   windows   opencv   cmake   clion

Cmake: How to have add_custom_command() run after all project files are built

问题 使用 Cmake v3.8,我需要我的自定义命令仅在生成新构建的 .hex、.map 和 .elf 文件后运行。 但是,在生成所有 *.hex、*.map 和 *.elf 文件后,该命令并未真正运行。 这是我所拥有的: add_custom_command( POST_BUILD COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/performCrc32.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT performCrc32.out COMMENT "Running CRC32 check..." ) add_custom_target( performCrc32 ALL DEPENDS performCrc32.py performCrc32.out ) 我错过了什么,如果有的话? 回答1 没有办法在“构建完全完成后”执行添加命令。 您可以添加特定目标构建后要执行的命令: add_custom_command(TARGET <kernel-target> POST_BUILD COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/performCrc32.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}

2022-05-17 02:34:09    分类:技术分享    build   cmake

How to set environment variable for build time in CMake? [duplicate]

问题 这个问题在这里已经有了答案: 如何修改传递给自定义 CMake 目标的环境变量? (3 个回答) 4年前关闭。 我有一个 python 脚本,它生成用于后续编译的.cpp源。 该脚本使用一些第 3 方模块,我正在尝试将PYTHONPATH设置为模块位置。 我试图做set(ENV${PYTHONPATH} "/path/to/modules") ,但不幸的是它只适用于生成时间,即execute_process(COMMAND python the_script.py) ,而我需要它为add_custom_command/add_custom_target工作。 我正在使用Visual Studio 14 2015 Win64生成器。 回答1 add_custom_command( ... COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH="/path/to/modules" python the_script.py )

2022-05-17 00:09:08    分类:技术分享    python   build   cmake

Can't link Boost 1.63.0 through CMake

问题 我正在尝试做的是从标题中猜到通过 CMake 链接 Boost 库(我正在与 CLion 一起编写跨平台代码,所以我没有其他机会)。 我确信我正确构建了所有内容,因为当我在 Visual Studio 中使用它时,它完全没有问题。 这是我的 CMake 代码: cmake_minimum_required(VERSION 3.7) project(BoostHello) set(BOOST_ROOT C:/boost_1.63.0) find_package(BOOST 1.6.0 REQUIRED) include_directories( ${Boost_INCLUDE_DIR} ) set(CMAKE_CXX_STANDARD 14) set(SOURCE_FILES main.cpp) add_executable(BoostHello ${SOURCE_FILES}) target_link_libraries( BoostHello ${Boost_LIBRARIES} ) 这是我的编译错误: "C:\Program Files (x86)\JetBrains\CLion 2017.1\bin\cmake\bin\cmake.exe" --build C:\Users\Admin\CLionProjects\BoostHello\cmake-build-debug

2022-05-16 21:26:08    分类:技术分享    c++   boost   cmake

CMake 3.8.0 generates wrong link command in makefiles

问题 问题: 在我运行 cmake 生成带有 STATIC 库的项目后,该项目成功完成,ninja 和 mingw32-make 都无法在链接时设置它们的目标。 对于 SHARED 库或可执行文件,相同的设置工作正常。 我已经为“Ninja”和“MinGW Makefiles”生成器尝试了这个: 忍者输出: [2/2] Linking CXX static library hello_wsl.lib FAILED: hello_wsl.lib cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E remove hello_wsl.lib && "" qc hello_wsl.lib CMakeFiles/hello_wsl.dir/lib_hello_world.cpp.obj && cd ." """" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable. ninja: build stopped: subcommand failed. mingw32-make 输出: Scanning dependencies of target hello_wsl [ 50%] Building

2022-05-16 20:21:04    分类:技术分享    c++   cmake   mingw-w64   ninja

One DLL unites them all - CMAKE,

问题 我偶然发现了一个问题..我想从以下位置创建一个库: 3 hpp(2 class.hpp,1 main.hpp) 3 个 cpp(2 个 class.cpp,1 个 main.hpp) 该库应该以“.xpl”作为结尾(Xplane10 插件),并且依赖于 ROS、STD 和我自己的数学库,我都将它们与 .xpl 链接到 CMake 和软件设计的新手..我只是试图改变一个工作的 cmake 创建一个 .exec "if(NOT("" STREQUAL "${MODULE_HEADERS}" 或 "" STREQUAL "${MODULE_SOURCES}")) foreach(plugin ${MODULE_PLUGIN_SOURCES} ${MODULE_HEADERS}) get_filename_component(CPP ${plugin} NAME_WE) set(PLUGIN_NAME "${MODULE_NAME}_${CPP}") add_library(${PLUGIN_NAME} SHARED ${MODULE_SOURCES} ${HEADER_MOC} ${plugin}) target_link_libraries(${PLUGIN_NAME} ${MODULE_LIBRARIES}) if(NOT ("" STREQUAL "${MODULE

2022-05-15 21:21:07    分类:技术分享    dll   plugins   cmake

cmake:missing and no known rule to make it when I import a prebuilt library

问题 我想使用这个 CmakeLists.txt 片段导入一个预建库: add_library(openssl-crypto SHARED IMPORTED ) set_target_properties(openssl-crypto PROPERTIES IMPORTED_LOCATION ${external_DIR}/libs/${ANDROID_ABI}/libcrypto.so ) include_directories(${external_DIR}/include/openssl) 我将其链接到我的图书馆: target_link_libraries(aes-crypto openssl-crypto) 尝试构建会返回此错误: '/libs/arm64-v8a/libcrypto.so', needed by ..., missing and no known rule to make it 回答1 我发现IMPORTED_LOCATION属性在传递给set_target_properties函数时不喜欢相对路径。 来自 IMPORTED_LOCATION 上的 CMake 文档 IMPORTED 目标的磁盘上主文件的完整路径。 为了解决这个问题,我改用了库的完整路径。 例子: set_target_properties ( curl-lib PROPERTIES

2022-05-15 19:42:05    分类:技术分享    cmake