3

私は次のように構成されたプロジェクトを持っています:

Libs/
Apps1/
Apps2/

各フォルダにはCMakeLists.txt. AppsN各フォルダーと各参照のプロジェクト ファイルを生成したいと思いますLibs。それを行う私の方法は、CMakeadd_subdirectory(../Libs/Source/LibN)などを呼び出すことです.

これを行うと、CMake はadd_subdirectory、バイナリ出力フォルダーに一意の絶対パスを指定する必要があると言います。

この投稿を参照してください。

異なるビルドディレクトリ間のXcodeの依存関係?

ビルド出力フォルダーがターゲットごとに一意である場合、XCodeは依存関係を処理できません。1 つのフォルダが必要です。そして、CMakeはデフォルトでこれを行います.フォルダーがサブディレクトリでない場合は拒否するだけです.

ターゲットが作成された後、出力パスを変更して変更しようとしました。これにより、オブジェクトが出力フォルダーにビルドされます。XCode はそれらを認識しますが、CMake スクリプト内のこのターゲットへのすべての参照は一意のパスを使用します。

提案された解決策は次のとおりです。

  • にプロジェクト ファイルを含めApp1/Projects/Subdir、関係のない場所にプロジェクトを複製する
  • フォルダーを共有親フォルダーに再編成して、この CMake の狂気を回避します。これにより、セキュリティ上の問題が発生します (一部のディレクトリは公開されていないため)。
  • 共有パス名を使用する代わりに、CMake 名でターゲットを参照しないでください。これを適切に行う方法がわからない
  • 何とかしてCMake側でこれにパッチを当ててみてください
  • プレメイクに切り替える
4

1 に答える 1

2

ルートに以下を追加してみてくださいCMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
PROJECT (ContainerProject)

SET (LIBRARY_OUTPUT_PATH ${ContainerProject_BINARY_DIR}/bin CACHE PATH
  "Single output directory for building all libraries.")
SET (EXECUTABLE_OUTPUT_PATH ${ContainerProject_BINARY_DIR}/bin CACHE PATH
  "Single output directory for building all executables.")
MARK_AS_ADVANCED(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH)

# for common headers (all project could include them, off topic)
INCLUDE_DIRECTORIES(ContainerProject_SOURCE_DIR/include)

# for add_subdirectory:
# 1) do not use relative paths (just as an addition to absolute path),
# 2) include your stuffs in build order, so your path structure should
#    depend on build order,
# 3) you could use all variables what are already loaded in previous
#    add_subdirectory commands.
#
# - inside here you should make CMakeLists.txt for all libs and for the
# container folders, too.
add_subdirectory(Libs)

# you could use Libs inside Apps, because they have been in this point of
# the script
add_subdirectory(Apps1)
add_subdirectory(Apps2)

Libs CMakeLists.txt

add_subdirectory(Source)

Source CMakeLists.txt

add_subdirectory(Lib1)
# Lib2 could depend on Lib1
add_subdirectory(Lib2)

このようにして、すべてのApps人がすべてのライブラリを使用できます。すべてのバイナリはあなたのバイナリになります${root}/bin

libの例:

PROJECT(ExampleLib)
INCLUDE_DIRECTORIES(
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
)
SET(ExampleLibSrcs
  ...
)
ADD_LIBRARY(ExampleLib SHARED ${ExampleLibSrcs})

実行可能ファイルの例(依存関係あり):

PROJECT(ExampleBin)
INCLUDE_DIRECTORIES(
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${ExampleLib_SOURCE_DIR}
)
SET(ExampleBinSrcs
  ...
)
# OSX gui style executable (Finder could use it)
ADD_EXECUTABLE(ExampleBin MACOSX_BUNDLE ${ExampleBinSrcs})
TARGET_LINK_LIBRARIES(ExampleBin
  ExampleLib
)

これは愚かで実用的な例です。

于 2012-05-18T12:50:37.147 に答える