Структура проекта:
rocksdb/CMakeLists.txt
...
rocksdb/third-party/CMakeLists.txt
rocksdb/third-party/snappy
В стороне rocksdb/third-party/CMakeLists.txt
, я добавил snappy в качестве внешнего проекта, как показано ниже:
# Snappy
IF(WITH_SNAPPY)
FIND_PACKAGE(snappy QUIET)
IF (NOT snappy_FOUND)
MESSAGE("[/third-party] snappy not found, build target")
ExternalProject_Add(snappy-project
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/snappy
CONFIGURE_COMMAND mkdir -p build
BUILD_IN_SOURCE 1
BUILD_COMMAND cd build && cmake ../ -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} -DSNAPPY_BUILD_TESTS=OFF -DHAVE_LIBLZO2=OFF && make -j 10
INSTALL_COMMAND cd build && ls -l && make install && cd ../ && rm -rf build)
ADD_LIBRARY(snappy STATIC IMPORTED GLOBAL)
ADD_DEPENDENCIES(snappy snappy-project)
SET_TARGET_PROPERTIES(snappy PROPERTIES
IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/libsnappy.a
INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include)
ELSE()
MESSAGE("[/third-party] snappy exist, not build")
ENDIF()
ENDIF()
И в CMakeLists.txt верхнего уровня я использую
add_subdirectory(third-party)
if(WITH_SNAPPY)
add_definitions(-DSNAPPY)
if(NOT TARGET snappy)
find_package(snappy QUIET)
if(NOT snappy_FOUND)
message("[] snappy find package failed!")
else()
message("[] snappy find package success!")
endif()
else()
message("[] snappy target existed!")
endif()
get_target_property(snappy_INCLUDE_DIR snappy INCLUDE_DIRECTORIES)
include_directories(${snappy_INCLUDE_DIR})
message("snappy include dir : ${snappy_INCLUDE_DIR}")
list(APPEND THIRDPARTY_LIBS snappy)
endif()
, чтобы сделать мгновенную цель доступной.
Но проблема в том, что когда я использую make -j 100
для сборки проекта RocksDB, оказывается, что мгновенный запуск не создается сначала.
Может кто поможет решить проблему? спасибо!
== EDIT == Вот как я использую snappy-библиотеку:
add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
target_link_libraries(${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
Я не вижу здесь никаких проблем, это действительно подключено!