我有一个项目A,它导出一个静态库作为目标:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Run Code Online (Sandbox Code Playgroud)
现在我想将项目A用作项目B的外部项目并包含其构建目标:
ExternalProject_Add(project_a
URL ...project_a.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Run Code Online (Sandbox Code Playgroud)
问题是当运行项目B的CMakeLists时,包含文件尚不存在.
有没有办法让include依赖于正在构建的外部项目?
我正在尝试使用ExternalProject_add()来下载/安装依赖项.它安装得很好,但我无法弄清楚如何在下载后实际链接库.
我想在刚下载的库上调用target_link_libraries(),但库的路径因系统而异.
如果这是系统依赖,我可以调用find_package() - 但是默认搜索路径上没有安装软件包.我不认为你可以在模块模式下为find_package指定搜索路径.
这是我的CMakeLists.txt片段不起作用:
ExternalProject_Add(
protobuf
URL http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
PREFIX ${MYPROJ_SOURCE_DIR}/dependencies
)
find_package(protobuf REQUIRED)
set(LIBS ${LIBS} ${PROTOBUF_LIBRARIES})
target_link_libraries (mybinary ${LIBS})
Run Code Online (Sandbox Code Playgroud) 我想建立一个已经将CMake作为我项目的CMake条带的一部分的第三方项目.ExternalProject_Add就是出于此目的,但我发现它只能用于特定的生成器,我想在很多平台上轻松工作.
例如,这里是zlib的外部项目添加脚本,它有自己的CMakeLists.txt:
set(USE_PROJECT_CMAKE_MODULE_PATH "-DCMAKE_MODULE_PATH=${MAKE_MODULE_PATH}")
ExternalProject_Add(ZLIB
SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/zlib
DOWNLOAD_COMMAND ""
UPDATE_COMMAND ""
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
${USE_PROJECT_CMAKE_MODULE_PATH}
INSTALL_COMMAND "")
ExternalProject_Add_Step(ZLIB installInternally
COMMAND cd <BINARY_DIR> && make install
DEPENDEES install
ALWAYS 1)
ExternalProject_Get_Property(ZLIB install_dir)
if(UNIX)
set(ZLIB_NAME libz)
else(UNIX)
set(ZLIB_NAME zlib)
endif(UNIX)
add_library(zlib UNKNOWN IMPORTED)
set_property(TARGET zlib PROPERTY IMPORTED_LOCATION ${install_dir}/lib/${ZLIB_NAME}.a)
set(ZLIB_LIBRARIES zlib)
set(ZLIB_LIBRARIES_OPTIONAL ${ZLIB_LIBRARIES})
set(ZLIB_DIR ${install_dir} CACHE INTERNAL "zlib ROOT dir")
set(ZLIB_INCLUDE_DIRS ${install_dir}/include CACHE INTERNAL "zlib include dirs")
set(ZLIB_DEFINES "-msse2 -mfpmath=sse" CACHE INTERNAL "zlib defines")
Run Code Online (Sandbox Code Playgroud)
这个问题是它适用于make,但不适用于Xcode或Visual Studio.也许有一些方法可以将传递给我的项目的cmake构建命令转发给ExternalProject_Add.
如何以最小的代码复杂性以跨平台的方式编写ExternalProject_Add调用,还是有更好的选择?
有没有正确的方法来找到一个用FindPackage()
它构建的库(via )ExternalProject_Add()
?
问题是CMake无法在CMake时找到库,因为外部库在编译时生成.我知道在构建库和superbuild中的项目时可以组合这两个CMake函数,但我想在普通的CMake项目中使用它.
事实上,我想建立VTK 6 ExternalProject_Add
并FindPackage
在我的CMake项目中找到它.
我有以下CMakeLists.txt文件:
cmake_minimum_required (VERSION 3.2 FATAL_ERROR)
project (utils VERSION 1.0.0 LANGUAGES CXX)
ExternalProject_Add(json-c
GIT_REPOSITORY "https://github.com/json-c/json-c.git"
UPDATE_COMMAND git pull "https://github.com/json-c/json-c.git"
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/SDL_image/./configure
--prefix=${SDL_INSTALL_DIR}
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/json-c
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
)
Run Code Online (Sandbox Code Playgroud)
我想将json-c库添加到我的项目中,但是当我运行cmake时,我收到错误:未知的CMake命令"ExternalProject_Add".我的CMake版本在OS X上是3.6.2
我不明白在ExternalProject_Add命令中使用INSTALL_DIR.我尝试使用它,但它似乎不起作用.这是一个CMakeLists.txt的示例,使用可快速编译的特征库:
cmake_minimum_required (VERSION 2.6)
project (example CXX)
include(ExternalProject)
include(ProcessorCount)
set(CMAKE_VERBOSE_MAKEFILE ON)
ProcessorCount(N)
if(NOT N EQUAL 0)
set(CMAKE_BUILD_FLAGS -j${N})
endif()
ExternalProject_Add
(
mylib
PREFIX myprefix
DOWNLOAD_COMMAND wget http://bitbucket.org/eigen/eigen/get/3.2.4.tar.gz && tar xvzf 3.2.4.tar.gz -C mylib --strip-components=1
)
Run Code Online (Sandbox Code Playgroud)
我选择了以下项目层次结构:
project
CMakeLists.txt
build/
Run Code Online (Sandbox Code Playgroud)
从构建存储库,我输入:
cmake ..
make
Run Code Online (Sandbox Code Playgroud)
安装过程失败,并显示以下消息:
文件无法创建目录:/ usr/local/include/eigen3.
也许需要管理权限.
据我所知,这意味着我需要在配置步骤中定义"前缀":
cmake -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR ..
Run Code Online (Sandbox Code Playgroud)
但是,INSTALL_DIR变量已在ExternalProject_Add命令中定义.但是,当我通过添加修改INSTALL_DIR的值时,我得到相同的错误
INSTALL_DIR myprefix/src/install
Run Code Online (Sandbox Code Playgroud)
在ExternalProject_Add命令中.
那么,INSTALL_DIR对什么有用呢?我究竟做错了什么?
当然,我知道如何提供自己的配置命令来添加前缀并解决问题.但这不是我的问题.我的问题是:如果我必须这样做,INSTALL_DIR的目的是什么?
我正在构建lua作为外部项目,我想使用我自己的CMakeLists.txt而不是捆绑的Makefile.这就是我在主CMakeLists.txt中的内容:
include(ExternalProject)
set(lua_RELEASE 5.1.4)
ExternalProject_Add(
lua-${lua_RELEASE}
URL http://www.lua.org/ftp/lua-${lua_RELEASE}.tar.gz
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download/lua-${lua_RELEASE}
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/lua/lua-${lua_RELEASE}
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/lua-${lua_RELEASE}
UPDATE_COMMAND ""
PATCH_COMMAND ""
INSTALL_COMMAND ""
)
Run Code Online (Sandbox Code Playgroud)
要使BUILD步骤起作用,SOURCE_DIR中必须有一个CMakeLists.txt.我现在在SOURCE_DIR中有这个CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(lua)
set(lua_library
lapi.c lcode.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c
lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c
ltable.c ltm.c lundump.c lvm.c lzio.c
lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c loslib.c
ltablib.c lstrlib.c loadlib.c linit.c
)
foreach(s ${lua_library})
set(lua_LIBRARY ${lua_LIBRARY} src/${s})
endforeach()
add_definitions(-DLUA_ANSI=1)
add_library(lua STATIC ${lua_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
这有效,但我不满意让lua源文件混乱我的版本控制CMakeLists.txt.
有没有办法为不在 SOURCE_DIR中的构建步骤指定自定义CMakeLists.txt ?
CMake的ExternalProject允许定义如何下载,配置,构建和安装外部项目.所有步骤都将在构建时执行.
我想在主项目配置期间执行外部项目的配置步骤.完成外部项目配置后,可以使用导入目标的描述,以便可以使用find_package()
函数加载外部项目.
是否可以在配置时构建一些目标?
首先,我对cmake相对较新.我正在尝试使用cmake构建一个具有单个外部依赖项的项目.我将外部项目的INSTALL_DIR指定为CMAKE_INSTALL_PREFIX,因此它将安装到与父项目相同的位置.但是当我运行make时,它会忽略它并尝试安装到/ usr/local/lib.
这是我的CMakeList.txt:
cmake_minimum_required( VERSION 2.8 )
include( ExternalProject )
project( capture )
add_library( capture SHARED capture.cc )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
ExternalProject_Add( proj_exceptions
GIT_REPOSITORY /home/user/workspace/exceptions
INSTALL_DIR ${CMAKE_INSTALL_PREFIX}
)
add_library( exceptions SHARED IMPORTED )
set_property( TARGET exceptions
PROPERTY IMPORTED_LOCATION ${CMAKE_INSTALL_PREFIX}/lib/libexceptions.so
)
add_dependencies( exceptions proj_exceptions )
include_directories( ${CMAKE_INSTALL_PREFIX}/include )
target_link_libraries( capture exceptions )
install( TARGETS capture DESTINATION lib )
install( FILES capture.h DESTINATION include )
Run Code Online (Sandbox Code Playgroud)
外部项目的CMakeLists.txt如下所示:
cmake_minimum_required( VERSION 2.8 )
project( exceptions )
add_library( exceptions SHARED exceptions.cc )
install( TARGETS …
Run Code Online (Sandbox Code Playgroud) 假设我有以下项目设置与这些依赖项:
MainProject
?? Dependency_1
? ?? Dependency_2
?? Dependency_2
Run Code Online (Sandbox Code Playgroud)
这些依赖关系的处理MainProject
和Dependency_1
与ExternalProject.
问题Dependency_2
将被下载两次:Dependency_1
将为自己MainProject
下载一个副本,并将为自己下载一个副本.
这不是一个有效的构建过程,有没有一种方法可以Dependency_2
为两个项目下载一次?
有人建议这个问题与此问题重复.这个问题与我的略有不同,因为我不能假设这些库将通过ExternalProject安装到主机系统.我还想要一个只有CMake的解决方案,而这个问题并不需要.