Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cmake - find_library - custom library location

Tags:

c++

windows

cmake

I'm currently trying to get CMake running for my project (on windows). I want to use a custom location where all libraries are installed. To inform CMake about that path I tried to do that:

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs) 

But when I try to find the library with

find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static) 

CMake can't find it. When I set my prefix path to

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs/curl) 

... the library is located.

So my question is: How can I configure CMake properly to work with a directory structore at a custom location which looks like that:

D:/develop/cmake/libs/ -> libA    -> include    -> lib -> libB    -> include    -> lib -> ...    -> include    -> lib 

In "include" lie the public headers and in "lib" are the compiled libraries.

Hope someone can help me - Thanks in advance

edit: The current workaround for me is, to do this before i search for libraries:

set(CUSTOM_LIBRARY_PATH D:/develop/cmake/libs) file(GLOB sub-dir ${CUSTOM_LIBRARY_PATH}/*) foreach(dir ${sub-dir})     if(IS_DIRECTORY ${dir})         set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH};${dir})     endif() endforeach() 

But that way the default module for boost wont find it until it because the directory structore of boost is a bit different.

boost -> include -> boost-1_50 -> *.hpp 

When I move the content if "boost-1_50" to "include" the library can be found but that way it's not possible to handle multiple versions right?

like image 336
Daniel Avatar asked Aug 22 '12 14:08

Daniel


People also ask

What does Find_library do CMake?

find_library (<VAR> name1 [path1 path2 ...]) This command is used to find a library. A cache entry, or a normal variable if NO_CACHE is specified, named by <VAR> is created to store the result of this command.

What is Cmake_find_root_path?

The CMake variable CMAKE_FIND_ROOT_PATH specifies one or more directories to be prepended to all other search directories. This effectively “re-roots” the entire search under given locations. Note that this variable is a list.


2 Answers

The simplest solution may be to add HINTS to each find_* request.

For example:

find_library(CURL_LIBRARY     NAMES curl curllib libcurl_imp curllib_static     HINTS "${CMAKE_PREFIX_PATH}/curl/lib" ) 

For Boost I would strongly recommend using the FindBoost standard module and setting the BOOST_DIR variable to point to your Boost libraries.

like image 154
Silas Parker Avatar answered Oct 04 '22 13:10

Silas Parker


I saw that two people put that question to their favorites so I will try to answer the solution which works for me: Instead of using find modules I'm writing configuration files for all libraries which are installed. Those files are extremly simple and can also be used to set non-standard variables. CMake will (at least on windows) search for those configuration files in

CMAKE_PREFIX_PATH/<<package_name>>-<<version>>/<<package_name>>-config.cmake 

(which can be set through an environment variable). So for example the boost configuration is in the path

CMAKE_PREFIX_PATH/boost-1_50/boost-config.cmake 

In that configuration you can set variables. My config file for boost looks like that:

set(boost_INCLUDE_DIRS ${boost_DIR}/include) set(boost_LIBRARY_DIR ${boost_DIR}/lib) foreach(component ${boost_FIND_COMPONENTS})      set(boost_LIBRARIES ${boost_LIBRARIES} debug ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-gd-1_50.lib)     set(boost_LIBRARIES ${boost_LIBRARIES} optimized ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-1_50.lib) endforeach() add_definitions( -D_WIN32_WINNT=0x0501 ) 

Pretty straight forward + it's possible to shrink the size of the config files even more when you write some helper functions. The only issue I have with this setup is that I havn't found a way to give config files a priority over find modules - so you need to remove the find modules.

Hope this this is helpful for other people.

like image 24
Daniel Avatar answered Oct 04 '22 12:10

Daniel