Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake - linking to library downloaded from ExternalProject_add()

I am trying to use ExternalProject_add() to download/install dependencies. It installs fine, but I can't figure out how to actually link the libraries after they are downloaded.

I want to call target_link_libraries() on the library that was just downloaded, but the path to the library will vary by system.

If this were a system dependency, I could just call find_package() - but the packages weren't installed on the default search path. I don't think you can specify a search path for find_package in module mode.

Here's a snippet of my CMakeLists.txt that doesn't work:

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}) 
like image 885
Brett Thomas Avatar asked Jun 15 '11 00:06

Brett Thomas


1 Answers

Because you're downloading the external project, you already know where everything is because you just downloaded it, so it doesn't need 'finding'.

I got it working with add_library. This is my actual code that works:

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) 

From there, each program that depends on it needs a add_dependencies and of course target_link_libraries. Eg:

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 - tells it to search for directories there
  • target_link_libraries - just add your library, as you named it (not a variable)

The add_dependencies makes it wait before trying to include the dirs needed.

That does the trick for me. Works with make -j4. Get's all the dependencies right.

like image 62
matiu Avatar answered Sep 20 '22 15:09

matiu