Bre*_*mas 46 cmake external-project
我正在尝试使用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)
mat*_*tiu 23
因为您正在下载外部项目,所以您已经知道所有内容,因为您刚刚下载了它,所以它不需要"查找".
我使用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)
Run Code Online (Sandbox Code Playgroud)
从那里,每个依赖它的程序都需要一个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)
Run Code Online (Sandbox Code Playgroud)
add_dependencies使它在尝试包含所需的dirs之前等待.
这对我有用.适用于make -j4.得到所有的依赖关系.
DLR*_*ave 19
当您使用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}")
Run Code Online (Sandbox Code Playgroud)
当然,这比使用find_package要方便.如果您可以使用预先构建/预安装的软件包,那么您应该使用find_package.但是,如果必须从源代码构建另一个包作为项目的一部分,则ExternalProject_Add很有用,即使它无法为您抽象出所有细节.
您可以使用link_directories命令链接特定目录中的库。在您的情况下,目录是您的外部项目正在构建。
ExternalProject_Add(MyExternalLibrary ...)
Run Code Online (Sandbox Code Playgroud)
将输出目录添加到搜索路径:
link_directories(${CMAKE_BINARY_DIR}/lib/MyExternalLibrary-prefix/lib)
Run Code Online (Sandbox Code Playgroud)
确保在指定链接目录后添加可执行文件:
add_executable(MyProgram main.c)
Run Code Online (Sandbox Code Playgroud)
指定您的项目应链接到的库:
target_link_libraries(MyProgram ExternalLibraryName)
Run Code Online (Sandbox Code Playgroud)
不要忘记依赖外部项目:
add_dependencies(MyProgram MyExternalLibrary)
Run Code Online (Sandbox Code Playgroud)
您可以使用另一个惯用语来解决此问题:
您可以在https://github.com/biometrics/likely中看到这个习惯用法的实际应用。
归档时间: |
|
查看次数: |
23192 次 |
最近记录: |