【问题标题】:cmake - adding a submodulecmake - 添加一个子模块
【发布时间】:2018-09-07 22:51:23
【问题描述】:

我正在尝试使用“子模块/子项目”构建一个测试项目。

编译失败:

example_01/src/main.cpp:2:10: fatal error: inc/foo2.hpp: No such file or directory
#include "inc/foo2.hpp" // #include "submodule/inc/foo2.hpp"
          ^~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/hello_world.dir/build.make:63: CMakeFiles/hello_world.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/hello_world.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

我的文件:

主 CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(hello_world)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

include_directories(${PROJECT_SOURCE_DIR})
add_subdirectory("submodule")
add_executable(${PROJECT_NAME} 
src/main.cpp 
src/foo.cpp)

main.cpp

#include "inc/foo.hpp"
#include "inc/foo2.hpp" // #include "submodule/inc/foo2.hpp"

int main()
{
    foo();
    foo2();

    return 0;
}

foo.cpp

#include <iostream>
#include "inc/foo.hpp"

void foo()
{
    std::cout << "Hello World!\n";
}

foo.hpp

void foo();

子模块 cmakelist

project(submodule_dummy1)
add_executable(${PROJECT_NAME} src/foo2.cpp)

foo2.cpp

#include <iostream>
#include "inc/foo2.hpp"

void foo2()
{
    std::cout << "FuuTwo\n";
}

foo2.hpp

void foo2();

还有什么我需要声明的,以便它可以“看到”子模块头吗?

更新

.
├── build
├── CMakeLists.txt
├── inc
│   └── foo.hpp
├── readme.md
├── src
│   ├── foo.cpp
│   └── main.cpp
└── submodule
    ├── CMakeLists.txt
    ├── inc
    │   └── foo2.hpp
    └── src
        └── foo2.cpp

新的主 cmakelist

cmake_minimum_required(VERSION 3.12)
project(hello_world)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/submodule)

add_subdirectory("submodule")
add_executable(${PROJECT_NAME} 
    src/main.cpp 
    src/foo.cpp)

新的错误信息

Scanning dependencies of target hello_world
[ 20%] Building CXX object CMakeFiles/hello_world.dir/src/main.cpp.o
[ 40%] Linking CXX executable hello_world
/usr/bin/ld: CMakeFiles/hello_world.dir/src/main.cpp.o: in function `main':
main.cpp:(.text+0xa): undefined reference to `foo2()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/hello_world.dir/build.make:99: hello_world] Error 1
make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/hello_world.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

【问题讨论】:

  • 您需要包含目录,其中包含所需的标头(在您的情况下为inc/foo2.hpp)。
  • 为了完整起见,请添加您的文件/子目录结构——目前还不清楚您列出的文件是如何组织的。 (我们可以看到您假设,但最好仔细检查这些假设是否真的成立。)
  • 我自己不使用add_subdirectory() 功能; include_directories() 设置是否从父级继承?
  • @DevSolar 请看“树”

标签: c++ cmake


【解决方案1】:

你错过了一个

include_directories(${PROJECT_SOURCE_DIR}/submodule)

在主 CMakeLists.txt 中。

您还需要编译和链接 submodule/src/foo2.cpp(通过将其作为参数添加到主 CMakeLists.txt 中的 add_executable 命令中。

【讨论】:

  • 看起来这让我更近了一步,谢谢。现在 main 看不到 foo2() 函数了。
  • 更新了我的答案
  • 谢谢。这行得通..但是通过在主cmakelist中包含一个子模块源文件,我有点错过了分离项目及其子模块的意义。是否没有选项可以在子模块 cmakelist 中包含来自子模块的源文件?
  • 如果每个子模块都有必须链接到主可执行文件的源代码,请考虑在每个子模块中创建一个static library(以子模块本身命名),这样您就可以轻松地将所有这些库链接到主可执行文件,不知道要链接的各个源文件的名称。
猜你喜欢
  • 2011-06-03
  • 2023-01-24
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多