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

|| 我正在尝试使用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})
    
已邀请:
        使用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很有用,即使它无法为您提取所有细节。     
        因为您正在下载外部项目,所以您已经知道所有内容都在哪里,因为您刚刚下载了它,所以它不需要“查找”。 我与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)
include_directories-告诉它在那里搜索目录 target_link_libraries-只需添加库即可,就像您命名的一样(不是变量) add_dependencies使它在尝试包括所需的目录之前等待。 那对我有用。与make -j4一起使用。正确获取所有依赖项。     
        要扩展上面的DLRdave答案,您不需要为静态库手动设置前缀和后缀,因为CMAKE为每个平台提供了正确的变量。 有关更多信息,请参见CMake有用变量。 例如: CMAKE_SHARED_LIBRARY_PREFIX CMAKE_SHARED_LIBRARY_SUFFIX CMAKE_STATIC_LIBRARY_PREFIX CMAKE_STATIC_LIBRARY_SUFFIX     
        您可以使用link_directories命令链接特定目录中的库。在您的情况下,该目录是您的外部项目的生成目录。
ExternalProject_Add(MyExternalLibrary ...)
将输出目录添加到搜索路径:
link_directories(${CMAKE_BINARY_DIR}/lib/MyExternalLibrary-prefix/lib)
确保在指定链接目录后添加可执行文件:
add_executable(MyProgram main.c)
指定您的项目应链接到的库:
target_link_libraries(MyProgram ExternalLibraryName)
不要忘记依赖外部项目:
add_dependencies(MyProgram MyExternalLibrary)
    
        您可以使用另一个惯用语来解决此问题: 使您的find_package命令为可选(删除\'REQUIRED \') 添加一些条件代码以仅在find_package成功时构建目标。 find_package将失败,并且不会在第一时间构建目标,但是将构建外部项目。 再次运行cmake / make,这次find_package将成功执行,并且将构建您的目标。 您可以在https://github.com/biometrics/likely中看到这个惯用语。     

要回复问题请先登录注册