C++ 如何获取ExternalProject定义的目标的输出路径?
我正在构建Google的FlatBuffers作为我自己项目的依赖项,我需要在构建时编译一个模式。我不想使用C++ 如何获取ExternalProject定义的目标的输出路径?,c++,xcode,cmake,flatbuffers,C++,Xcode,Cmake,Flatbuffers,我正在构建Google的FlatBuffers作为我自己项目的依赖项,我需要在构建时编译一个模式。我不想使用BuildFlatBuffers.cmake或FindFlatBuffers.cmake,因为我使用的是一个特定的版本,我不能依赖它在本地安装 这是myCMakeLists.txt的简化版本: ExternalProject_Add ( flatbuf URL "https://github.com/google/flatbuffers/archive/v1.8.0.tar.gz"
BuildFlatBuffers.cmake
或FindFlatBuffers.cmake
,因为我使用的是一个特定的版本,我不能依赖它在本地安装
这是myCMakeLists.txt的简化版本:
ExternalProject_Add (
flatbuf
URL "https://github.com/google/flatbuffers/archive/v1.8.0.tar.gz"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
)
add_custom_target (
flatbuf_schema
PREFIX ${FLATBUF_PREFIX}
DEPENDS flatbuf
COMMAND ${FLATBUF_PREFIX}/src/flatbuf-build/flatc --cpp ${FLATBUF_SCHEMA}
)
它在Make和Ninja中运行良好,但在Xcode中失败,Xcode在Debug
目录中构建flatc
我考虑了以下可能的解决方案:
- 使用
add_subdirectory
而不是ExternalProject_add
,这样我就可以使用${FLATBUFFERS\u FLATC\u EXECUTABLE}
或$
李>
- 手动为
flatbuf
分配RUNTIME\u OUTPUT\u目录李>
- 在多个路径中搜索
flatc
(不可移植;我也不知道如何在构建时实现)
我试了(2)和(3),但没有成功。至于(1),我不确定这是个好主意。如何以可移植的方式构建模式?您可以使用类似这样的方法
注意:我想您甚至不需要安装flatbuf,只需构建并使用它即可
ExternalProject_Add (
flatbuf_project
URL "https://github.com/google/flatbuffers/archive/v1.8.0.tar.gz"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(flatbuf_project source_dir)
ExternalProject_Get_Property(flatbuf_project binary_dir)
# Export flatbuf executable to consume schema file during build
add_executable(flatbuf::flatbuf IMPORTED)
set_target_properties(flatbuf::flatbuf PROPERTIES IMPORTED_LOCATION
"${binary_dir}/flatc")
add_dependencies(flatbuf::flatbuf flatbuf_project)
add_custom_target(flatbuf_schema
PREFIX ${FLATBUF_PREFIX}
COMMAND flatbuf::flatbuff --cpp ${FLATBUF_SCHEMA}
)
注2:
如果命令指定了一个可执行目标名称(由add_executable()命令创建),则该名称将自动替换为生成时创建的可执行文件的位置。如果设置了,交叉编译\u EMULATOR可执行文件目标属性也将添加到命令之前,以允许可执行文件在主机上运行。此外,还将添加一个目标级依赖项,以便在该自定义目标之前构建可执行目标
注3:
不幸的是,目标别名无法在导入的目标上工作…显然,CMake提供了一个变量来解决这个确切的问题,即CMake\u CFG\u INTDIR
()。然后,指向flatc
可执行文件的路径应为
ExternalProject_Get_Property(flatbuf BINARY_DIR)
set (FLATC "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/flatc")
不太确定Xcode中的问题是什么。如果你真的被卡住了,你可以做的一件事就是看看它能做什么,因为它也依赖于FlatBuffers,至少用于在所有平台上平等构建,包括Xcode。Xcode的问题是它在不同的目录中构建flatc:它没有将flatc放入flatbuf build/
而是进入flatbuf build/build/
。不仅构建外部项目,而且安装它。这个项目完全定义了它的安装布局,一个构建工具(在你的例子中是XCode)不会改变它。这是有意义的。那么,我应该设置哪些变量使安装目录在所有构建系统中都相同?注意:Xcode中flatc的路径是flatbuf build/Debug/
,而不是flatbuf build/build/
。这是一个输入错误。最后我可以用CMAKE\u CFG\u INTDIR
来完成,但是使用ExternalProject\u Get\u属性来代替硬编码构建路径也是一个好主意。