当前位置: 首页 > 知识库问答 >
问题:

CMake找不到git子模块的头文件

宋英杰
2023-03-14

我有两个带有CMake的git存储库,一个是游戏引擎,另一个是我正在用游戏引擎制作的游戏。

原来,这个游戏引擎有一个子模块包含在项目的cmakelists.txt中,而在游戏存储库中,游戏引擎被添加为一个子模块,也包含在cmakelists.txt中。但是在编译两个项目的时候,游戏引擎编译一切正常,没有错误,我更新游戏知识库更新子模块,而在编译游戏的时候,不知什么原因没有找到游戏引擎子模块。

游戏引擎CMakelists:

cmake_minimum_required(VERSION 3.8)

set(PROJECT_NAME "Enel")

set(CMAKE_CXX_STANDARD 17)

project(${PROJECT_NAME} VERSION 0.1.0)

include_directories(
    "${PROJECT_SOURCE_DIR}/include"
    "${PROJECT_SOURCE_DIR}/src"
    "${PROJECT_SOURCE_DIR}/libs/spdlog/include"
    "${PROJECT_SOURCE_DIR}/libs/spdlog/src"
)

file(GLOB SRC_FILES
    "${PROJECT_SOURCE_DIR}/include/**/*.h"
    "${PROJECT_SOURCE_DIR}/include/**/*.hh"
    "${PROJECT_SOURCE_DIR}/include/**/*.hpp"
    "${PROJECT_SOURCE_DIR}/src/**/*.c"
    "${PROJECT_SOURCE_DIR}/src/**/*.cc"
    "${PROJECT_SOURCE_DIR}/src/**/*.cpp"
)

add_library(${PROJECT_NAME} STATIC ${SRC_FILES})

游戏玩家:

cmake_minimum_required(VERSION 3.8)

set(PROJECT_NAME "Minicraft")

set(CMAKE_CXX_STANDARD 17)

project(${PROJECT_NAME} VERSION 0.1.0)

include_directories(
    "${PROJECT_SOURCE_DIR}/include"
    "${PROJECT_SOURCE_DIR}/src"
    "${PROJECT_SOURCE_DIR}/libs/enel/include"
    "${PROJECT_SOURCE_DIR}/libs/enel/src"
)

link_directories(${PROJECT_SOURCE_DIR}/libs/enel)

file(GLOB SRC_FILES
    "${PROJECT_SOURCE_DIR}/include/**/*.h"
    "${PROJECT_SOURCE_DIR}/include/**/*.hh"
    "${PROJECT_SOURCE_DIR}/include/**/*.hpp"
    "${PROJECT_SOURCE_DIR}/src/**/*.c"
    "${PROJECT_SOURCE_DIR}/src/**/*.cc"
    "${PROJECT_SOURCE_DIR}/src/**/*.cpp"
    "${PROJECT_SOURCE_DIR}/libs/enel/src/**/*.c"
    "${PROJECT_SOURCE_DIR}/libs/enel/src/**/*.cc"
    "${PROJECT_SOURCE_DIR}/libs/enel/src/**/*.cpp"
    "${PROJECT_SOURCE_DIR}/libs/enel/include/**/*.h"
    "${PROJECT_SOURCE_DIR}/libs/enel/include/**/*.hh"
    "${PROJECT_SOURCE_DIR}/libs/enel/include/**/*.hpp"
)

add_executable(${PROJECT_NAME} ${SRC_FILES})

生成输出:

[ 33%] Building CXX object CMakeFiles/Minicraft.dir/src/MC/Game.cc.o
In file included from /home/yorichii/repos/minicraft/libs/enel/include/Enel/Platform/EntryPoint.hh:4,
                 from /home/yorichii/repos/minicraft/src/MC/Game.cc:2:
/home/yorichii/repos/minicraft/libs/enel/include/Enel/Util/Log.hh:3:10: fatal error: spdlog/spdlog.h: Arquivo ou diretório inexistente
    3 | #include <spdlog/spdlog.h>
      |          ^~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/Minicraft.dir/build.make:76: CMakeFiles/Minicraft.dir/src/MC/Game.cc.o] Erro 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/Minicraft.dir/all] Erro 2
make: *** [Makefile:84: all] Erro 2

共有1个答案

夏和雅
2023-03-14

如果使用基于目录属性,如include_directorylink_directory,则必须重复以下要求:

include_directories(
    "${PROJECT_SOURCE_DIR}/include"
    "${PROJECT_SOURCE_DIR}/src"
    "${PROJECT_SOURCE_DIR}/libs/enel/include"
    "${PROJECT_SOURCE_DIR}/libs/enel/src"
    # Repeat all requirements
    "${PROJECT_SOURCE_DIR}/libs/enel/libs/spdlog/include"
    "${PROJECT_SOURCE_DIR}/libs/enel/libs/spdlog/src"
)

这就是为什么您应该强烈考虑基于目标的属性,因为所有现代构建系统都在使用,包括现代CMAKE:

以Enel表示:

cmake_minimum_required(VERSION 3.8)

set(PROJECT_NAME "Enel")

set(CMAKE_CXX_STANDARD 17)

project(${PROJECT_NAME} VERSION 0.1.0)

# If you can install spdlog in a local directory in the project,
# prefer find_package(spdlog REQUIRED)
add_subdirectrory(libs/spdlog)

file(GLOB SRC_FILES
    "strongly/consider/not/globbing/**/*.cpp"
)

add_library(Enel STATIC ${SRC_FILES})

target_link_libraries(Enel PUBLIC spdlog)
target_include_directories(Enel PUBLIC src include)

然后在你的游戏中,这样做:

cmake_minimum_required(VERSION 3.8)

set(PROJECT_NAME "Minicraft")

set(CMAKE_CXX_STANDARD 17)

project(${PROJECT_NAME} VERSION 0.1.0)

add_subdirectory(libs/enel)

file(GLOB SRC_FILES
   ...
)

add_executable(Minicraft ${SRC_FILES})

# Links to all required libraries, add all required include directories
target_link_libraries(Minicraft PUBLIC Enel)
target_include_directory(Minicraft PUBLIC include src)
 类似资料:
  • 问题内容: 问题 我正在尝试在Jenkins中构建应用程序,它在Github上的一个私有仓库中,还有一个私有子模块。 我可以通过设置凭据来在Jenkins中克隆私有存储库,但是Jenkins无法克隆子模块,这是构建失败的输出: 这就是我在詹金斯试图做的 试图将其他行为设置为“高级子模块行为”,但没有成功。 在使用phpunit运行测试之前,尝试设置一个新步骤: 试图在我的子模块的项目上设置一个gi

  • 我正在尝试使用Cmake构建C项目,但它找不到我下载并正确安装的LibXml2库(我相信)。这是在带有cmake 3.7.1的Windows 10计算机上。 以下是 cmake 配置文件的相关部分: 以下是我的环境变量: 以下是C:\Program Files\libxml2目录的内容: 我收到的cmake输出是: C:/程序文件/CMake/共享/cmake-3.7/模块/查找包处理程序标准Ar

  • 我有一个使用基于PowerMock的单元测试的大型Maven multiproject构建。我正在子模块中生成一个“target/jacoco.exec”,并在子模块的整个父pom中进行插件配置。我有一个附加的子模块,它只使用“报告-聚合”,并将各种子模块指定为依赖项。这些基本上都起作用了。 我现在正在尝试将这些数据与Sonarqube集成。安装的SonarQube Java Analyzer版本

  • 问题内容: 我最近在计算机上安装了cx_Oracle模块,以连接到远程Oracle数据库服务器。(我身边没有Oracle客户端)。 Python:2.7 x86版 Oracle:版本11.1.X x64 Cx_Oracle:版本5.1.2-11g.win32-py2.7 然后,每次我运行脚本时,脚本都会失败并显示以下消息: ImportError:DLL加载失败:找不到指定的模块。 我想知道是否我

  • 更新到Glassish v.3.1.2.2后,我不断得到这个错误: 应用程序构建没有错误,使用 Maven Glassfish 插件进行部署: 响应: 找不到application.xml中定义的子模块[appname . war]。EAR部署失败。 当我在已部署的EAR文件夹中搜索Glassfish domain applications文件夹时,我看到了以下文件结构: 当我使用文本编辑器打开.

  • 问题内容: 我收到错误,无法在Node.js应用程序中找到模块“ bcrypt” 我尝试使用 npm install bcrypt 安装它, 但仍然出现问题。 错误信息: 问题答案: 使用命令无法为我解决问题。 我尝试了以下命令,但问题解决了。