Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compilation 使用CMake编译和链接子项目库_Compilation_Cmake_Subproject - Fatal编程技术网

Compilation 使用CMake编译和链接子项目库

Compilation 使用CMake编译和链接子项目库,compilation,cmake,subproject,Compilation,Cmake,Subproject,我有两个项目(prj1和prj2)。一个(prj2)依赖于作为静态库的另一个(prj1)。我来这里是为了用CMake单独编译它们 但是我需要将一个(prj1)集成到另一个(prj2)中。因此,我希望CMake先编译静态库(prj1),然后链接静态库(prj2)。我试过了,但没用 prj1“核心”为 prj2“SDL2”为(见分支添加核心) 在prj2中,externals/core是一个git子模块(对于非git用户,可以将此目录视为prj1的复制粘贴)。 我在prj2“SDL2”中尝试了这

我有两个项目(prj1和prj2)。一个(prj2)依赖于作为静态库的另一个(prj1)。我来这里是为了用CMake单独编译它们

但是我需要将一个(prj1)集成到另一个(prj2)中。因此,我希望CMake先编译静态库(prj1),然后链接静态库(prj2)。我试过了,但没用

  • prj1“核心”为
  • prj2“SDL2”为(见分支添加核心)
在prj2中,externals/core是一个git子模块(对于非git用户,可以将此目录视为prj1的复制粘贴)。 我在prj2“SDL2”中尝试了这个CMakeLists.txt(没有成功):

这是prj2树的简化版本:

.
├── build (with CMake stuff generated with "cmake ..")
├── CMakeLists.txt
├── externals
│   └── core
│       ├── build (with CMake stuff generated with "cmake ..")
│       ├── CMakeLists.txt
│       ├── makefile
│       └── src
├── makefile
├── README.md
└── src
    ├── compilation_config.h.in
    └── planet-wars-2d-rt-sdl2.cpp
如何使用CMake编译prj2“SDL2”中的prj1“core”库,然后将prj1库与prj2链接(再次使用CMake)

如果您的解决方案不适用于非GNU/Linux操作系统,这不是一个大问题。注意:我的电脑运行在Debian GNU/Linux 8“Jessie”上

问候。

我无法访问您的回购协议,可能是服务器因维护而停机。如果我正确理解您的问题,您可以创建如下结构:

根/

  • CMakeLists.txt//1
  • src/
    • CMakeLists.txt//2
    • main.cpp
    • SDL2/
      • 一些来源
      • CMakeLists.txt//3
    • 核心/
      • 一些来源
      • CMakeLists.txt//4
在CMakeLists.txt[1]中,您应该声明您的项目名称、所需的包、通用标志、包括路径等:

cmake_minimum_required( VERSION 2.x )
project(name)

include_directories(inc inc/core inc/SDL2 inc/SthElse)

add_subdirectory(src)
在CMakeLists.txt[2]中,对于subdir src,您应该声明主可执行文件,并使用prj1和prj2添加subdir

 add_subdirectory(core)
 add_subdirectory(SDL2)
 add_executable(main main.cpp)
 target_link_libraries(main core SDL2 SomeOtherLib)
最后,在lib dirs中的CMakeLists.txt[3]&&[4]中,您应该声明静态库:

 add_library(core STATIC ${YourSourceFiles})
这种方法一直对我有效。如果您以前将“core”和“SDL2”作为独立的二进制文件编译和运行,那么您可能需要对它们进行一些重新组织。

这两个项目都有一个文件“compilation\u config.h”。在编译时,由于使用的代码是模棱两可的
\include“compilation\u config.h”
,因此编译失败


因此,我在这两个项目中都创建了一个“include/project name”目录,并更改了include路径:“prj1/compilation_config.h”或“prj2/compilation_config.h”。多亏了这一点,就没有了模棱两可的地方,所以它现在可以工作了

我访问回购协议没有问题。我已经用文件组织更新了我的第一篇文章。它(prj2中的CMake)尝试编译“externals/core/src/specific/planet-wars-2d-rt-text.cpp”(这不是库的一部分,对prj2“SDL2”毫无用处),但它失败了,因为找不到LIB_planet_wars_2d_rt_core_VERSION_MAJOR。该宏是在“externals/core/build/compilation_config.h”(由“externals/core/src/specific/compilation_config.h.in”和CMake生成)中定义的。是否必须将库(此处为SDL)放在主项目的根目录下?如果我将我的供应商(第三方)存储在源代码上方的其他位置,是否仍有可能?似乎
add_子目录
拒绝了到顶部的相对路径。@Sandburg,是的,如果要将此库编译为项目的一部分,它应该位于主项目的根目录下;如果您在外部拥有它,这基本上意味着这个库不是您项目的一部分-然后您可以单独编译它,安装(系统级或本地)并在您的项目中使用
find_-package
(如果库提供适当的
*。cmake
脚本,SDL2就可以)
 add_library(core STATIC ${YourSourceFiles})