首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CMake -链接到从ExternalProject_add下载的库()

CMake -链接到从ExternalProject_add下载的库()
EN

Stack Overflow用户
提问于 2011-06-15 08:06:38
回答 6查看 33.6K关注 0票数 60

我正在尝试使用ExternalProject_add()来下载/安装依赖项。它安装得很好,但我不知道如何在下载后真正链接这些库。

我想在刚刚下载的库上调用target_link_libraries(),但库的路径因系统而异。

如果这是一个系统依赖项,我可以只调用find_package() --但是这些包并没有安装在默认的搜索路径上。我不认为你可以在模块模式下为find_package指定一个搜索路径。

这是我的CMakeLists.txt的一个片段,它不能工作:

代码语言:javascript
运行
复制
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})
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-15 17:47:17

当您使用ExternalProject_Add时,您不能使用find_package,因为在运行CMake来配置外部项目时没有什么可查找的。

因此,如果库位置因平台而异,您将需要基于您的平台的条件逻辑。(我不知道protobuf在这里的库或结构,所以这只是一个示例,但它应该会让您朝着正确的方向前进……)如下所示:

代码语言:javascript
运行
复制
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是很有用的,即使它不能为您抽象出所有细节。

票数 20
EN

Stack Overflow用户

发布于 2015-03-29 09:08:42

因为您正在下载外部项目,所以您已经知道所有东西的位置,因为您刚刚下载了它,所以它不需要“查找”。

我让它和add_library一起工作。这是我实际运行的代码:

代码语言:javascript
运行
复制
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。例如:

代码语言:javascript
运行
复制
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)

  • include_directories -告诉它搜索目录there
  • target_link_libraries -只需添加您命名的库(而不是变量)

在尝试包含所需的目录之前,add_dependencies会让它等待。

这对我来说很管用。与make -j4一起使用。所有的依赖项都是正确的。

票数 41
EN

Stack Overflow用户

发布于 2013-07-12 21:40:15

要扩展上面的DLRdave答案,您不需要手动设置静态库的前缀和后缀,因为CMAKE为每个平台提供了正确的变量。

有关详细信息,请参阅CMake Useful Variables

例如:

  • CMAKE_SHARED_LIBRARY_PREFIX
  • CMAKE_SHARED_LIBRARY_SUFFIX
  • CMAKE_STATIC_LIBRARY_PREFIX
  • CMAKE_STATIC_LIBRARY_SUFFIX
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6351609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档