标签: cmake-modules

CMake find_package:它在哪里找到包?

在我的 CMake 包中,有一个对find_package. 这成功了,太好了!然而,事实证明是错误的包版本。我现在想去删除那个包。但是,我不知道它在我的系统上的什么地方,也不-config.cmake知道 CMake 必须在某个地方找到的文件在哪里。有没有办法find_package让我提供这些信息?或者至少详细地告诉我它在哪里搜索?

我虽然这可能在变量中CMAKE_MODULE_PATH,但这对我来说是空的。所以我猜它在某个地方的默认路径中。但是CMake在很多地方搜索了包,我在我记得的通常位置没有找到它。

cmake cmake-modules

10
推荐指数
2
解决办法
3105
查看次数

如何忽略子目录中的所有 cmake dev 警告?

我正在使用一些外部库,这些库作为 git 子模块包含在该add_subdirectory命令中。其中一些正在使用旧版本的 cmake,并发出有关策略 CMP0048 和 CMP0077 的警告。

有没有办法关闭这些库的所有 cmake 警告?

我尝试在包含项目之前明确设置策略,OLD但没有帮助。

我不想编辑 git 子模块中的任何文件,因为当有人必须克隆我的项目的存储库并在他们的计算机上构建它时,就会有额外的步骤。

cmake cmake-modules cmake-language

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

如何为“类似 boost”的多组件库编写 cmake 模块?

我目前正在编写一个 C++ 库,它有几个“子库”,例如 boost 库。

让我们将库命名为“TestLib”和子库“Base”和“Ext”,其中 Base 包含基本内容,不依赖于任何其他子库。然而,Ext 依赖于某些 Base 类。

每个“子库”都应该编译成一个单独的 .a 或 .so 文件,但它们都应该共享一个命名空间(TestLib)。现在我的目标是编写干净的 cmake 脚本以实现这一目标。

最后,我希望能够在 cmake 中做这样的事情:

find_package(TestLib 0.1 REQUIRED COMPONENTS Base Ext)
Run Code Online (Sandbox Code Playgroud)

或者

target_link_libraries(someapplication
PUBLIC
    TestLib::Base
)
Run Code Online (Sandbox Code Playgroud)

我将每个“子库”放在一个单独的 git 存储库中,并将它们作为子模块添加到一个新存储库中,该存储库只有一个 CMakeLists.txt,它只在每个存储库上调用 add_subdirectory。

我实现的大部分 cmake 东西,都是从https://pabloariasal.github.io/ 上的这个很棒的教程中获得的

并且 Base 部分按预期工作(这并不奇怪,因为它不依赖于其他任何东西)。

但是我的问题来自于 Ext 部分。为了编译它,我必须链接到 Base 库,这应该不会太难,并且经过一些试验和错误,我确信我会让它工作。

但我想以正确的方式做到这一点。

我的方法是

find_package(TestLib COMPONENTS Base)
Run Code Online (Sandbox Code Playgroud)

在 TestLib.Ext 的 CMakeLists.txt 中。但这无法找到,因为它没有 TestLibConfig.cmake。

这是有道理的,但我不知道在这个文件中放什么。

我试图提供一些准确描述我的问题的代码,但由于在这里发布太多了,我为此创建了一个 github:

https://github.com/PowerSupplyTopologies/TestLib

这应该包含所有相关的代码。

这对你们中的一些人来说可能是微不足道的,但我敢打赌有更多的人可以从这种方法中受益。

预先感谢您的任何想法。

编辑:

Base的CMakeLists.txt中的库创建是:

set(TARGET_NAME testlibbase)

add_library(${TARGET_NAME}
    src/ClassA.cpp
    src/ClassB.cpp
)

#Add an alias …
Run Code Online (Sandbox Code Playgroud)

c++ cmake libraries git-submodules cmake-modules

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

如何使用 CMake 创建包

.
+-- MyPack
|   +-- Lib1
|   |   +-- include
|   |   |   +-- Lib1.h
|   |   +-- src
|   |   |   +-- Lib2.cpp
|   |   +-- CMakeLists.txt
|   +-- Lib2
|   |   +-- include
|   |   |   +-- Lib2.h
|   |   +-- src
|   |   |   +-- Lib2.cpp
|   |   +-- CMakeLists.txt
|   +-- CMakeLists.txt
+-- SubProject1
|   +-- CMakeLists.txt
+-- SubProject2
|   +-- CMakeLists.txt
+-- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

大家好。

我是 CMake 的新手,我正在尝试获得如下内容。考虑到我的 C++ 项目的上述目录树:

我有一个目录(比如“MyPack”),其中包含几个子目录(Lib1、Lib2...),每个子目录代表我编写的一个 C++ 库。

如何设置所有内容以便我可以find_package(MyPack)在其他子项目中编写? …

c++ cmake cmake-modules

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

Python C扩展:致命Python错误:PyThreadState_Get:没有当前线程

我正在尝试构建一个使用ffmpeg库的基于C的Python扩展.由于我必须导入一堆库.我用过CMake.我按照python doc的说明进行操作

使用CMake构建没有任何问题.但是当我导入库时,我得到以下异常.

Fatal Python error: PyThreadState_Get: no current thread
Run Code Online (Sandbox Code Playgroud)

我使用mac与python2.7.14(使用Brew安装).

以下是我的

的CMakeLists.txt

cmake_minimum_required(VERSION 3.11)
project(extractor C)

set(CMAKE_C_STANDARD 99)

set(EXECUTABLE_NAME "extractor")

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)

set(EXTRACTOR_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
set(target_dir "bin")

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -std=99")

add_library(${EXECUTABLE_NAME} SHARED src/frame_extractor.c)
# add_library(${EXECUTABLE_NAME} SHARED src/dipoza.c)

# add_executable(${EXECUTABLE_NAME} main.c)
include_directories(".")
find_package(FFmpeg REQUIRED)

if (FFMPEG_FOUND)
    message("Found FFMPEG/LibAV libraries ${FFMPEG_LIBRARIES}")
    include_directories(${FFMPEG_INCLUDE_DIR})
    target_link_libraries(${EXECUTABLE_NAME} ${FFMPEG_LIBRARIES})
else (FFMPEG_FOUND)
    message("cant find libavcodec, libavformat or libavutil. add them manually!!")
endif (FFMPEG_FOUND)

target_link_libraries(${EXECUTABLE_NAME} ${FFMPEG_LIBRARIES})
target_link_libraries (${EXECUTABLE_NAME} "-lm")
target_link_libraries(${EXECUTABLE_NAME} "-framework CoreServices")
target_link_libraries(${EXECUTABLE_NAME} "-framework CoreFoundation")
target_link_libraries(${EXECUTABLE_NAME} …
Run Code Online (Sandbox Code Playgroud)

python cpython cmake python-extensions cmake-modules

6
推荐指数
0
解决办法
289
查看次数

如何使用 CMAKE 为交叉编译配置设置特定的 CMAKE_C_OUTPUT_EXTENSION?

我正在尝试设置一个工具链文件,以便与 CMake 3.12.0 版本进行交叉编译。

我的目标文件.obj与 Windows 和.oUNIX 中的扩展名不同。

因此,我将我的设置CMAKE_LANG_OUTPUT_EXTENSION.src.

不幸的是,这个变量被CMakeCInformation.cmake这些行中的文件覆盖:

# some compilers use different extensions (e.g. sdcc uses .rel)
# so set the extension here first so it can be overridden by the compiler specific file
if(UNIX)
  set(CMAKE_C_OUTPUT_EXTENSION .o)
else()
  set(CMAKE_C_OUTPUT_EXTENSION .obj)
endif()
Run Code Online (Sandbox Code Playgroud)

如果我注释这些行,我的配置将起作用并且将使用正确的对象扩展。

我认为我的工具链文件已配置为 CMake 不会执行其内部编译器检查。

这是我的工具链文件条目行的外观:

SET(CMAKE_SYSTEM_NAME Generic)

INCLUDE(CMakeForceCompiler)

SET(CMAKE_C_COMPILER_FORCED TRUE)
SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
#other compiler configuration lines here 
SET(CMAKE_C_OUTPUT_EXTENSION .src)
SET(CMAKE_ASM_OUTPUT_EXTENSION .o)
SET(CMAKE_C_OUTPUT_EXTENSION_REPLACE 1)
SET(CMAKE_ASM_OUTPUT_EXTENSION_REPLACE 1)
Run Code Online (Sandbox Code Playgroud)

我知道 …

c++ build cmake cmake-modules

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

FindPackageHandleStandardArgs 到底做了什么?

我正在尝试为我已安装的软件包编写查找模块。但我在理解 CMake 函数时遇到了困难。

\n\n

这是我的代码片段。

\n\n
find_package(PkgConfig)\npkg_check_modules(PC_zcm QUIET zcm)\n\nfind_path(zcm_INCLUDE_DIR\n        NAMES zcm.h\n        PATHS $ENV{PATH}\n        )\nmark_as_advanced(zcm_FOUND zcm_INCLUDE_DIR)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(zcm DEFAULT_MSG\n        REQUIRED_VARS zcm_INCLUDE_DIR\n        )\n
Run Code Online (Sandbox Code Playgroud)\n\n

find_path()能够找到我的zcm_INCLUDE_DIR就好了:/usr/bin/zcm/usr/local/include

\n\n

但 find_package_handle_standard_args() 给出 \n-- Could NOT find zcm (missing: REQUIRED_VARS)

\n\n

我的目录树如下所示:

\n\n
\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 zcm\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 eventlog.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 json\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 json-forwards.h\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 json.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 message_tracker.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tools\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 IndexerPlugin.hpp\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 TranscoderPlugin.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 transport\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 generic_serial_transport.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 transport.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 transport_register.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 transport_registrar.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 url.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 util\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Filter.hpp\n …
Run Code Online (Sandbox Code Playgroud)

cmake cmake-modules

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

现代 CMake 3 与 QT5“Qt5::QtCore”但未找到目标

我对 CMake 和简单的 QT 示例有疑问。我正在更新我的 CMake 配置以遵循现代的执行方式,这意味着支持 CMake > v3.0。

这是我的 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

project("test")

set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS Core REQUIRED)
message(STATUS "Qt5 version: ${Qt5_VERSION}")
get_target_property(QtCore_location Qt5::Core LOCATION)
message(STATUS "Qt5 version: ${QtCore_location}")

add_executable(Test main.cpp)
target_link_libraries(Test Qt5::QtCore)
Run Code Online (Sandbox Code Playgroud)

我的代码示例(main.cpp)

#include <QApplication>
#include <QProgressBar>
#include <QSlider>

int main(int argc, char **argv)
{
 QApplication app (argc, argv);

 // Create a container window
 QWidget window;
 window.setFixedSize(200, 80);

 // Create a progress bar
 // with the range between 0 and 100, and a starting value …
Run Code Online (Sandbox Code Playgroud)

c++ qt cmake qt5 cmake-modules

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

Cmake FindBoost.cmake MinGW-W64:搜索名称不正确的库

我已经构建了Boost 1.68(使用来自https://gist.github.com/sim642/29caef3cc8afaa273ce6的说明,并添加link=static,shared到b2命令行中还可以构建共享库。)

库似乎正确构建,并且我已经正确设置了BOOST_INCLUDEDIRBOOST_LIBRARYDIR环境变量。

但是,当我将以下内容添加到时CMakeLists.txt

find_package(Boost REQUIRED COMPONENTS system context coroutine thread random REQUIRED)
Run Code Online (Sandbox Code Playgroud)

并生成MinGW Makefiles,出现以下错误:

CMake Error at C:/Users/pbelanger/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/182.4129.15/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:2044 (message):
  Unable to find the requested Boost libraries.

  Boost version: 1.68.0

  Boost include path: C:/boost/install/include/boost-1_68

  Could not find the following static Boost libraries:

          boost_system
          boost_context
          boost_coroutine
          boost_thread
          boost_random

  Some (but not all) of the required Boost libraries were found.  You may
  need to install these additional Boost libraries.  Alternatively, …
Run Code Online (Sandbox Code Playgroud)

c++ windows boost cmake cmake-modules

4
推荐指数
2
解决办法
382
查看次数

如何在 CMake 项目中包含相同依赖项的两个不同版本?

我的系统中同时存在 1.2 和 2.2 版本的 ExternalProject。ExternalProject 是一个 CMake 项目,当我要求它们时,CMake 可以毫无问题地找到这两个版本。命令find_package(ExternalProject 1.2 EXACT)查找版本 1.2 并find_package(ExternalProject 2.2 EXACT)查找版本 2.2。

版本 1 和 2 彼此不兼容。API 完全不同。

我有一个 CMake 项目 MyProject,它有两个目标,targetOne 和 targetTwo。TargetOne 使用 ExternalProject 1.2,TargetTwo 使用 ExternalProject 2.2。

下面的代码没有做我想要的。相同的外部依赖项不会被查找两次。TargetTwo 的编译失败。CMake 是否以任何方式支持这种情况?(除非重命名 ExternalProject 版本 2 并在不同的位置编译它)。

project(MyProject)

find_package(ExternalProject 1.2 EXACT)
add_executable(targetOne target_one.c)
target_link_libraries(targetOne ExternalProject::externalProject)

find_package(ExternalProject 2.2 EXACT)
add_executable(targetTwo target_two.c)
target_link_libraries(targetTwo ExternalProject::externalProject)
Run Code Online (Sandbox Code Playgroud)

cmake dependency-management cmake-modules

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