2016-04-21 5 views
1

ich einige Hilfsfunktionen haben, die mir im Dateisystem geteilt und statischen Bibliotheken auffinden:CMAKE: Anrufe wiederholt funktionieren mit verschiedenen Argumenten die gleichen Ergebnisse geben

Ich habe eine Hilfsfunktion, die die eigentliche Suche durchführt, da ein name und eine suffix:

function(do_find_lib LIB_NAME SUFFIX OUT) 

    set(CMAKE_FIND_LIBRARY_SUFFIXES ${SUFFIX}) 

    find_library(FOUND ${LIB_NAME}) 

    if(NOT FOUND) 
     message(SEND_ERROR "unable to find library ${LIB_NAME}") 
    endif() 

    message(STATUS "search: ${LIB_NAME}.${SUFFIX} result: ${FOUND}") 

    set(${OUT} ${FOUND} PARENT_SCOPE) 

endfunction() 

die Funktion find_static_lib den entsprechenden Suffix setzt, und ruft do_find_lib:

function(find_static_lib LIB_NAME OUT) 

    if (WIN32 OR MSVC) 
     set(SUFFIX ".lib") 
    elseif (UNIX) 
     set(SUFFIX ".a") 
    endif()  

    do_find_lib(${LIB_NAME} ${SUFFIX} FOUND) 

    message(STATUS "static lib search: ${LIB_NAME} result: ${FOUND}") 

    set(${OUT} ${FOUND} PARENT_SCOPE) 

endfunction() 

In ähnlicher Weise der Funktion find_shared_lib das entsprechende Suffix setzt und fordert do_find_lib:

function(find_shared_lib LIB_NAME OUT) 

    if (WIN32 OR MSVC) 
     set(SUFFIX ".dll") 
    elseif (UNIX) 
     set(SUFFIX ".so") 
    endif()  

    do_find_lib(${LIB_NAME} ${SUFFIX} FOUND) 

    message(STATUS "shared lib search: ${LIB_NAME} result: ${FOUND}") 

    set(${OUT} ${FOUND} PARENT_SCOPE) 

endfunction() 

Je nach Bedarf an anderer Stelle in meiner Cmake Hierarchie verwende ich diese Funktionen verschiedene Bibliotheken

Das erste Mal, dass ich verwenden finden es funktioniert:

Zuerst suche ich nach tcmalloc statische Bibliothek.

find_shared_library(tcmalloc_minimal TCMALLOC) 

Hier ist die resultierende Ausgabe:

-- search: tcmalloc_minimal.a result: /usr/local/lib/libtcmalloc_minimal.a 
-- static lib search: tcmalloc_minimal result: /usr/local/lib/libtcmalloc_minimal.a 

Das zweite Mal, dass ich es verwenden, es bricht:

Next I für protobuf gemeinsam genutzte Bibliothek zu suchen.

find_shared_library(protobuf PROTOBUF) 

Hier ist die resultierende Ausgabe:

-- search: protobuf.so result: /usr/local/lib/libtcmalloc_minimal.a 
-- shared lib search: protobuf result: /usr/local/lib/libtcmalloc_minimal.a 

Fehler:

Wah? Die Suche nach protobuf mit Suffix .so findet das vorherige Sucher, /usr/local/lib/libtcmalloc_minimal.a

Frage:

  • Warum ist das passiert?
  • Gibt es einen Fehler in meinen Funktionen?
  • Was muss ich tun, um die erforderliche Bibliothek richtig zu suchen?

Hinweise:

ich abgeschlossen habe mein Build-Verzeichnis gelöscht und die Makefiles wieder aufbauen, so glaube nicht, dass dies ein Problem mit einem Cache.

+4

Ich bin nicht sicher, dass Ihre Frage als besser formuliert ist, [dass man] (http://stackoverflow.com/questions/36757842/cmake-use-foreach- und-find-library-to-return-full-path-of-libraries /), wurde 14 Stunden vorher gefragt. Warum wird diese ähnliche Frage benötigt? – Tsyvarev

Antwort

0

Aus der Dokumentation auf find_library:

A cache entry named by <VAR> is created to store the result of this command.
If the library is found the result is stored in the variable and the search will not be repeated unless the variable is cleared.

This cmake mailing list answer zeigt haben Sie die Variable FOUND-NOTFOUND zu setzen, um den Cache zu löschen.

set(FOUND FOUND-NOTFOUND) 

Allerdings könnte man argumentieren, dass dies ein anti-Muster, wie diese tun besiegt das Verhalten Caching von find_library

Es wäre besser, einen eindeutigen Variablennamen zu verwenden für jede eindeutige Suche.

Hier wird die Variable FOUND_${LIB_NAME}${SUFFIX} genannt:

function(do_find_lib LIB_NAME SUFFIX OUT) 

    set(CMAKE_FIND_LIBRARY_SUFFIXES ${SUFFIX}) 

    find_library(FOUND_${LIB_NAME}${SUFFIX} ${LIB_NAME}) 

    if(NOT FOUND_${LIB_NAME}${SUFFIX}) 
     message(SEND_ERROR "unable to find library ${LIB_NAME}") 
    endif() 

    set(${OUT} ${FOUND_${LIB_NAME}${SUFFIX}} PARENT_SCOPE) 

endfunction() 
Verwandte Themen