我正在尝试使用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})
发布于 2011-06-15 17:47:17
当您使用ExternalProject_Add时,您不能使用find_package,因为在运行CMake来配置外部项目时没有什么可查找的。
因此,如果库位置因平台而异,您将需要基于您的平台的条件逻辑。(我不知道protobuf在这里的库或结构,所以这只是一个示例,但它应该会让您朝着正确的方向前进……)如下所示:
if(WIN32)
set(PROTOBUF_LIB_DIR "${MYPROJ_SOURCE_DIR}/dependencies/win"
set(prefix "")
set(suffix ".lib")
elseif(APPLE)
set(PROTOBUF_LIB_DIR "${MYPROJ_SOURCE_DIR}/dependencies/mac"
set(prefix "lib")
set(suffix ".a")
else()
set(PROTOBUF_LIB_DIR "${MYPROJ_SOURCE_DIR}/dependencies/linux"
set(prefix "lib")
set(suffix ".a")
endif()
set(PROTOBUF_LIBRARIES
"${PROTOBUF_LIB_DIR}/${prefix}protobufLib1${suffix}"
"${PROTOBUF_LIB_DIR}/${prefix}protobufLib2${suffix}")
诚然,这不像使用find_package那么方便。如果您可以使用预先构建/预先安装的软件包,那么您应该这样做,以便您可以使用find_package。但是,如果您必须从源代码构建另一个包作为项目的一部分,那么ExternalProject_Add是很有用的,即使它不能为您抽象出所有细节。
发布于 2015-03-29 09:08:42
因为您正在下载外部项目,所以您已经知道所有东西的位置,因为您刚刚下载了它,所以它不需要“查找”。
我让它和add_library一起工作。这是我实际运行的代码:
ExternalProject_Add(ForexConnectDownload
PREFIX 3rd_party
#--Download step--------------
URL http://fxcodebase.com/bin/forexconnect/1.3.1/ForexConnectAPI-1.3.1-Linux-x86_64.tar.gz
URL_HASH SHA1=7fdb90a2d45085feb8b76167cae419ad4c211d6b
#--Configure step-------------
CONFIGURE_COMMAND ""
#--Build step-----------------
BUILD_COMMAND ""
#--Install step---------------
UPDATE_COMMAND "" # Skip annoying updates for every build
INSTALL_COMMAND ""
)
SET(FXCM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/3rd_party/src/ForexConnectDownload/include)
SET(FXCM_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/3rd_party/src/ForexConnectDownload/lib)
add_library(ForexConnect SHARED IMPORTED)
set_target_properties(ForexConnect PROPERTIES IMPORTED_LOCATION ${FXCM_LIB_DIR}/libForexConnect.so)
从那时起,依赖它的每个程序都需要一个add_dependencies
,当然还有target_link_libraries
。例如:
include_directories(${FXCM_INCLUDE_DIR})
add_executable(syncDatabase syncDatabase.cpp trader/database.cpp trader/fxcm.cpp)
target_link_libraries(syncDatabase ForexConnect)
add_dependencies(syncDatabase ForexConnectDownload)
在尝试包含所需的目录之前,add_dependencies会让它等待。
这对我来说很管用。与make -j4一起使用。所有的依赖项都是正确的。
发布于 2013-07-12 21:40:15
要扩展上面的DLRdave答案,您不需要手动设置静态库的前缀和后缀,因为CMAKE为每个平台提供了正确的变量。
有关详细信息,请参阅CMake Useful Variables。
例如:
https://stackoverflow.com/questions/6351609
复制相似问题