我有一个跨平台的项目,它包含一些静态库和几十个依赖它们的可执行文件 . 我已经有Windows,Linux,Android,iOS和OSX的工作项目,我将它移植到CMake以减少维护 .

我已经为每个库和项目创建了基本的CMakeFiles,并且按照平台相关的位进行了按摩,从Windows和Linux开始,一直用到Android和现在的MacOS .

每个库都有一个可以自己调用的CMakeFiles.txt . 每个可执行文件也有CMakeLists.txt,并通过add_subdirectory,add_dependency和target_link_libraries引用它所需的每个库(通常是全部) .

它完成了我对Visual Studio生成器的期望:它为每个库和可执行文件生成一个.vcxproj文件,可执行文件的.sln文件将所有内容放在一起,定义项目依赖项和静态库中的链接 . 这也反映了我之前项目的结构(在开始使用cmake之前) .

但是,OSX XCode生成器的行为有所不同:

我期望的是,与Visual Studio项目类似,每个.xcodeproj应该定义自己的目标,而exectuable的.xcodeproj应该是由库项目生成的库,并链接他们的产品(即实际的静态库)在 .

然而,这不会发生 - 相反,会发生的是,库被添加为“文件夹”而不是项目引用:它们的文件直接从主可执行项目编译 - 它们是目标而不是项目引用 . 没有定义链接 . 实际上有静态库的目标,但它们似乎根本没有链接 .

这绝对不是我的项目结构 . How can I make CMake generate XCode generate project-level dependencies instead of just adding the files in?

可执行文件CMakeList的摘录,其中定义了依赖项

project(Executable1)

set(CMAKE_MACOSX_BUNDLE TRUE)
set(LIBRARY_BIN_FOLDER "${PROJECT_ROOT}/Libraries/Bin/OSX/$<CONFIG>")
set(CMAKE_FILES_FOLDER "${PROJECT_ROOT}/Libraries/Bin/OSX/cmake")

set (SRC_FILES Executable1.cpp ... and others... )
...    
set_source_files_properties (${XIB_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
set_source_files_properties (${PLIST_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
...     
add_executable( Executable1 MACOSX_BUNDLE ${SRC_FILES} ${XIB_FILE} ${PLIST_FILE})
set_target_properties( Executable1 PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Build/OSX/info.plist")

###################  That's how I add the libraries ###############
add_subdirectory(${PROJECT_ROOT}/Libraries/Lib1 ${CMAKE_FILES_FOLDER}/Lib1)
add_subdirectory(${PROJECT_ROOT}/Libraries/Lib2 ${CMAKE_FILES_FOLDER}/Lib2)

add_dependencies(Executable1 Lib1  Lib2)

target_link_libraries(  Executable1
                        ${LIBRARY_BIN_FOLDER}/${CMAKE_STATIC_LIBRARY_PREFIX}LIB1${CMAKE_STATIC_LIBRARY_SUFFIX}
                        ${LIBRARY_BIN_FOLDER}/${CMAKE_STATIC_LIBRARY_PREFIX}LIB2${CMAKE_STATIC_LIBRARY_SUFFIX})

图书馆CMakeLists的摘录(是的,它们很简单)

project(Library1)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/Bin/OSX)


file(GLOB SOURCES ...cpps, h..., mm...)
            )
ADD_LIBRARY(Library1 STATIC ${SOURCES})

target_compile_definitions( PVRShell PUBLIC $<$<CONFIG:Debug>:DEBUG=1> $<$<NOT:$<CONFIG:Debug>>:RELEASE=1> )