2015-12-08 2 views
0

Я организую свои «политики разработки на C» и распространяю некоторые коды в статических и общих библиотеках.Лучшая практика CMake с использованием версий разделяемых библиотек

Статические библиотеки в порядке, но я нашел «пробел» в отношении общих библиотек в документации: как указать SOVERSION на «find_library».

В этот момент я построения библиотек так:

cmake_minimum_required (VERSION 2.8.11) 

set (INSTALL_BIN_DIR "" CACHE PATH "full binary path") 
set (INSTALL_LIB_DIR "$ENV{HOME}/embedded/llib/lib" CACHE PATH "full binary path") 
set (INSTALL_INCLUDE_DIR "$ENV{HOME}/embedded/llib/include" CACHE PATH "full include path") 
set (SRC_DIR "src" CACHE PATH "Source files path") 
set (H_DIR "include" CACHE PATH "Source files path") 

set (C_FILES) 
list (
    APPEND C_FILES 
    ${SRC_DIR}/cJSON.c 
    ) 

set (H_FILES) 
list (
    APPEND H_FILES 
    ${H_DIR}/cJSON.h 
    ) 

# Define Project name 
project (cJSON) 

# Create a library called "cJSON" which includes the source and header files. 
add_library (cJSON SHARED "${C_FILES}") 

#set_target_properties(cJSON PROPERTIES 
# PUBLIC_HEADER "include/cJSON.h") 

include_directories (include) 
# Make sure the compiler can find include files for our Hello library 
# when other libraries or executables link to Hello 
#target_include_directories (cJSON PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 

set_target_properties (cJSON 
         PROPERTIES 
          VERSION 1.0 SOVERSION 1 
          PUBLIC_HEADER "${H_FILES}" 
        ) 

install(TARGETS cJSON 
# IMPORTANT: Add the foo library to the "export-set" 
    EXPORT cJSONTargets 
    LIBRARY 
    RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin 
    LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib 
    PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}" COMPONENT dev 
) 

Бег CMake, сделать и сделать установку это приводит:

lrwxrwxrwx 1 takaite takaite 13 Dez 7 11:52 libcJSON.so -> libcJSON.so.1 
lrwxrwxrwx 1 takaite takaite 15 Dez 7 11:52 libcJSON.so.1 -> libcJSON.so.1.0 
-rw-r--r-- 1 takaite takaite 27194 Dez 7 15:03 libcJSON.so.1.0 

А в другой библиотеке, я в том числе это путь:

cmake_minimum_required (VERSION 2.8.11) 

set (INSTALL_BIN_DIR "" CACHE PATH "full binary path") 
set (INSTALL_LIB_DIR "$ENV{HOME}/embedded/llib/lib" CACHE PATH "full binary path") 
set (INSTALL_INCLUDE_DIR "$ENV{HOME}/embedded/llib/include" CACHE PATH "full include path") 
set (SRC_DIR "src" CACHE PATH "Source files path") 
set (H_DIR "include" CACHE PATH "Source files path") 

set (C_FILES) 
list (
    APPEND C_FILES 
    ${SRC_DIR}/dict.c 
    ) 

set (H_FILES) 
list (
    APPEND H_FILES 
    ${H_DIR}/dict.h 
    ) 


# Define Project name 
project (dict) 

set (CMAKE_FIND_LIBRARY_SUFFIXES_BKP ${CMAKE_FIND_LIBRARY_SUFFIXES}) 
# Set lib version to be used 
set (CMAKE_FIND_LIBRARY_SUFFIXES ".so.1") 

find_library (
    CJSON_LIB 
    NAMES cJSON 
    PATHS ${INSTALL_LIB_DIR} 
    ) 
set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BKP}) 

message ("cJSON_lib: ${CJSON_LIB}") 

# Create a library called "cJSON" which includes the source and header files. 
add_library (dict SHARED "${C_FILES}" ${CJSON_LIB}) 

include_directories (${H_DIR} ${INSTALL_INCLUDE_DIR}) 
# Make sure the compiler can find include files for our Hello library 
# when other libraries or executables link to Hello 
#target_include_directories (cJSON PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 

set_target_properties (dict 
         PROPERTIES 
          VERSION 1.0 SOVERSION 1 
          PUBLIC_HEADER "${H_FILES}" 
        ) 

install(TARGETS dict 
# IMPORTANT: Add the foo library to the "export-set" 
    EXPORT DictTargets 
    LIBRARY 
    RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin 
    LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib 
    PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}" COMPONENT dev 
) 

Я не могу поверить, что это правильный способ сделать это. Может ли кто-нибудь показать мне лучший способ?

ответ

2

Для поиска конкретных soversion библиотеки можно использовать точное имя файла в NAMES вариант для find_library:

find_library (
    CJSON_LIB 
    NAMES libcJSON.so.1 
    PATHS ${INSTALL_LIB_DIR} 
    ) 

Из документации для find_library:

Каждая библиотека имени, данного варианта ИМЕНА сначала рассматривается как имя файла библиотеки, а затем рассматривается с префиксами конкретной платформы (например, lib) и суффиксами (например .so). Поэтому можно напрямую указать имена файлов библиотек, например libfoo.a. Это можно использовать для поиска статических библиотек в UNIX-подобных системах.


Обратите внимание, что различные soversion с одной и той же библиотеки предполагаются ABI совместимы друг с другом. Поэтому редко приходится искать определенную совпадение библиотеки.

Изменение в библиотеке, вносящее ABI incopatibility должно сопровождаться с изменением библиотеки версии. Например: libcJSON2.so. Поэтому вы не можете случайно найти несовместимую библиотеку, используя find_library.

Смежные вопросы