3

2 つのプロジェクト (prj1 と prj2) があります。一方 (prj2) は、スタティック ライブラリであるもう一方 (prj1) に依存します。私はCMakeでそれらを別々にコンパイルするために到着しました。

しかし、1 つ (prj1) をもう 1 つ (prj2) に統合する必要がありました。したがって、CMake でスタティック ライブラリ (prj1) を他の (prj2) の前にコンパイルしてから、スタティック ライブラリをリンクするようにします。私は物事を試しましたが、idは機能しませんでした。

prj2 では、externals/core は git サブモジュールです (git を使用しないユーザーの場合、このディレクトリは prj1 のコピー アンド ペーストとして表示されます)。私はprj2 "SDL2"でこのCMakeLists.txtを(成功せずに)試しました:

cmake_minimum_required(VERSION 2.8)


if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
    "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  set(CMAKE_CXX_FLAGS       "-Wall -Wextra -Wformat=2 -Wpedantic -D_FORTIFY_SOURCE=2")
  set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  # TODO
endif()

set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
# if (CMAKE_VERSION VERSION_LESS "3.1")
#   if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
#       CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
#     set (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
#   endif()
# else()
#   set(CMAKE_CXX_STANDARD 11)
# endif()

project(PlanetWars2dRT-SDL2)

# Version number
set(VERSION_MAJOR "0")
set(VERSION_MINOR "0")
set(VERSION_MICRO "0")

# Configure a header file to pass some of the CMake settings
# to the source code.
configure_file (
  "src/compilation_config.h.in"
  "${PROJECT_BINARY_DIR}/compilation_config.h"
  )
# Add the binary tree to the search path for include files
# so that we will find compilation_config.h
include_directories("${PROJECT_BINARY_DIR}")

set(LIBRARY_OUTPUT_PATH    lib/${CMAKE_BUILD_TYPE})
set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})

include_directories(src/)
file(
  GLOB_RECURSE
  source_files
  src/*
  )
add_executable(planet-wars-2d-rt-sdl2 ${source_files})

#include(ExternalProject)
#ExternalProject_Add(PlanetWars2dRT PREFIX externals/core/)
include_directories(externals/core/src/utils/ externals/core/src/specific/)
add_subdirectory(externals/core/)
#find_package(PlanetWars2dRT-core REQUIRED)

include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)
pkg_search_module(SDL2GFX REQUIRED SDL2_gfx)
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIRS})
target_link_libraries(
  planet-wars-2d-rt-sdl2
  planet-wars-2d-rt-core
  ${SDL2_LIBRARIES} ${SDL2GFX_LIBRARIES}
  )

これは、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

prj2 "SDL2" の prj1 "core" のライブラリを CMake でコンパイルし、prj1 のライブラリを prj2 にリンクするにはどうすればよいですか (再び CMake を使用)。

ソリューションが非 GNU/Linux OS で動作しない場合でも、大きな問題ではありません。注: 私の PC は Debian GNU/Linux 8 "Jessie" で実行されています。

よろしく。

4

2 に答える 2

7

あなたのリポジトリhttps://gitlab.com/RyDroid/PlanetWars2dRT-SDL2/にアクセスできません。おそらくサーバーがメンテナンスのためにダウンしています。あなたの問題を正しく理解していれば、次のような構造を作成できます。

根/

  • CMakeLists.txt // 1
  • ソース/
    • 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)

サブディレクトリ src の CMakeLists.txt [2] で、メインの実行可能ファイルを宣言し、prj1 と prj2 でサブディレクトリを追加する必要があります。

 add_subdirectory(core)
 add_subdirectory(SDL2)
 add_executable(main main.cpp)
 target_link_libraries(main core SDL2 SomeOtherLib)

最後に、lib ディレクトリの CMakeLists.txt [3] && [4] で、静的ライブラリを宣言する必要があります。

 add_library(core STATIC ${YourSourceFiles})

このアプローチは常に私にとってうまくいきました。「core」と「SDL2」をスタンドアロンのバイナリとしてコンパイルして実行していた場合は、おそらくそれらを少し再編成する必要があります。

于 2015-12-01T17:53:17.783 に答える
0

どちらのプロジェクトにも「compilation_config.h」というファイルがあります。コンパイル時に、使用されたコードがあいまいであったため、間違っていると見なされてコンパイルが失敗し#include "compilation_config.h"ました。

そこで、両方のプロジェクトに「include/project-name」ディレクトリを作成し、インクルード パスを「prj1/compilation_config.h」または「prj2/compilation_config.h」に変更しました。おかげで曖昧さがなくなり、動くようになりました!

于 2015-12-13T23:00:09.990 に答える