如何在 CMake 项目中包含外部库

Posted

技术标签:

【中文标题】如何在 CMake 项目中包含外部库【英文标题】:How To Include External Libraries in CMake Project 【发布时间】:2020-09-20 21:22:41 【问题描述】:

我对如何静态包含 SDL2 的源代码感到困惑。我正在尝试这样做以使我正在开发的库更便携。

当我将其设置为可执行文件时,该库已正常编译,但当我将其更改为库时,它不会包含该库。

目前,当我尝试将我的库包含在另一个项目中时,它会显示 “无法打开包含文件:'SDL2/SDL.h':没有这样的文件或目录”。所以它让我认为错误的原因是包含目录没有与静态库一起导出。

我的文件系统:

include
--Header Files
src
--Source Files
extern
--SDL2
build

这是导致错误的文件示例:

#include <iostream>
#include <SDL.h> //Error

using namespace std;

/* The code */

这是我的主要 CMakeLists.txt 的示例:

cmake_minimum_required(VERSION 3.7)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

project(MyProject VERSION 1.0.0)

set(SDL2_SOURCE_DIR “$CMAKE_SOURCE_DIR/extern/SDL2”)
add_subdirectory(extern/SDL2)
add_subdirectory(src)

这是我的 src CMakeLists.txt 的示例:

set(PROJECT_NAME MyProject)

file(GLOB HEADER_FILES "$CMAKE_SOURCE_DIR/include/*.h")
file(GLOB SOURCES "*.cpp")

add_library($PROJECT_NAME $SOURCES $HEADER_FILES)

target_include_directories($PROJECT_NAME PUBLIC "$CMAKE_SOURCE_DIR/include" PUBLIC "$CMAKE_SOURCE_DIR/extern/SDL2/include")

target_link_libraries($PROJECT_NAME PRIVATE SDL2main SDL2-static)

set_target_properties( $PROJECT_NAME
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "$CMAKE_SOURCE_DIR/lib"
    LIBRARY_OUTPUT_DIRECTORY "$CMAKE_SOURCE_DIR/lib"
    RUNTIME_OUTPUT_DIRECTORY "$CMAKE_SOURCE_DIR/bin"
)

【问题讨论】:

请显示构建命令的完整详细输出。 【参考方案1】:

来自sdl2 CMakeLists.txt试试:

set(SDL_STATIC 1)
add_subdirectory(extern/SDL2) # And I recommend EXCLUDE_FROM_ALL

还要确保添加检查:

 foreach(i IN ITEMS SDL2main SDL2-static)
    if(NOT TARGET $i)
       message(FATAL_ERROR "$i is not a target")
     endif()
 endif()
 target_link_libraries($PROJECT_NAME PRIVATE SDL2main SDL2-static)

【讨论】:

我试图将 SDL_STATIC 设置为 1,但我得到了同样的错误 “严重代码描述项目文件行抑制状态错误 C1083 无法打开包含文件:'SDL.h':没有这样的文件或目录”。此外检查没有工作它不会编译。只是添加,但是当我制作可执行文件时代码会编译,但是当我将其更改为库时它失败了。 @YamiOG SDL.h 是否确实存在于您提供的包含路径中:$CMAKE_SOURCE_DIR/extern/SDL2/include ?? 是的,它确实有 SDL.h。该代码在我制作可执行文件时有效,但在我制作库时无效。

以上是关于如何在 CMake 项目中包含外部库的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 cmake 项目中包含另一个 cmake 项目的头文件?

如何使用 Eclipse 中包含的外部库创建 jar?

如何在 CMakeLists 中包含库头文件

如何在 android 库 gradle 项目中包含依赖项?

在 CMAKE 中包含来自 Android 项目的不同文件夹的静态库

如何安装 CMake 在 find_package 中包含 catkin/ROS 的项目?