如何在我的项目中链接RE2库,就像静态库和Cmake

问题描述 投票:0回答:1

我的问题:在这一刻,我将libre2链接起来,但我想静态地做到这一点。我将库安装在我的PC(sudo apt-get install libre2-dev)中,得到了“二进制”,并将此二进制“ libre2.so”链接在我的可执行文件中。但是我想git克隆存储库或通过git subpodule做到这一点,然后构建此存储库并静态地将其链接在我的项目中。 我在这里新来,对不起,我的英语不好。

我的项目结构

    bin
  1. build

      外部
    • re2
      • main.cpp
      • Cmakelists.txt
      ReadMe.md
    • Cmakelists.txt
    • Cmake_minimum_required(版本2.6)
    • Project(SIMMC-AGENT)
  2. version编号
  3. SET(version_major 0)

    set(version_minor 0)

    CPR需要C ++11

    SET(cmake_cxx_flags“ $ {cmake_cxx_flags} -std = c ++ 11”)

    SRC:main

    file(全球源 *.cpp)

    链接res图书馆dinamichine

    SET(re2_libraries -l $ {re2_library_dir} -l libre2.so)

    SRC:收集功能 - 依赖OS

    IF(Win32)

    file(glob sources $ {sources} src/windows/windows/

    .cpp)

    else()#if(unix)

    file(glob sources $ {sources} src/linux/linux/linux/cpp)

    endif()

    Headers

    include_directories(“ include”)

    -Test
    option(print_json“在发送之前设置为打印json对象”
    消息(状态“ $ {print_json}:$ {$ {print_json}}”)
    如果(print_json)
    add_definitions(-dprint_json)
    endif()

    Compile

    SET(cmake_runtime_output_directory“ ../ bin”) add_executable(agent-v $ {version_major}。$ {version_minor} $ {sources})

    target_link_libraries(agent-v $ {version_major}。$ {version_minor} $ {re2_library})


    main.cpp

    #包括
    #include

    使用名称空间std;

    使用名称空间RE2;

    IntMain(int argc,char ** argv){
  4. cout
  5. IntMatchResult;

    MatchResult= Re2 :: FullMatch(“ Hello”,“H。*O”); cout
    return 0;

    }


    << "hello world" << endl;

    Edit-(26.01.17):大家好。我在这里谈论我如何解决它。 按照一些提示提供了此处的提示,我创建了一个名为

    re2.cmake

    :<< "matchResult = " << matchResult << endl;

    的文件。
    cmake_minimum_required ( VERSION 2.8.7 )
    
    if (NOT RE2_NAME)
    
    include (ExternalProject)
    
    SET (RE2_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/re2/src/re2/)
    SET (RE2_EXTRA_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/re2/src/re2/)
    SET (RE2_URL https://github.com/google/re2.git)
    SET (RE2_BUILD ${CMAKE_BINARY_DIR}/re2/src/re2)  
    SET (RE2_LIBRARIES ${RE2_BUILD}/obj/so/libre2.so)
    get_filename_component(RE2_STATIC_LIBRARIES ${RE2_BUILD}/libre2.a ABSOLUTE)  
    SET (RE2_INCLUDES ${RE2_BUILD})
    
    if ( WIN32 )   
      SET (RE2_STATIC_LIBRARIES ${RE2_BUILD}/${CMAKE_BUILD_TYPE}/re2.lib) 
    else ()   
      SET (RE2_STATIC_LIBRARIES ${RE2_BUILD}/libre2.a) 
    endif ()
    
    ExternalProject_Add(RE2      
      PREFIX RE2      
      GIT_REPOSITORY ${RE2_URL}      
      # GIT_TAG ${RE2_TAG}      
      DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"      
      BUILD_IN_SOURCE 1      
      INSTALL_COMMAND sudo make install     
       CMAKE_CACHE_ARGS         
        -DCMAKE_BUILD_TYPE:STRING=Release          -DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF          -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON  
    )
    
     ## put re2 includes in the directory where they are expected  
     add_custom_target(re2_create_destination_dir COMMAND ${CMAKE_COMMAND} -E make_directory ${RE2_INCLUDE_DIR}/re2 DEPENDS re2)   
    
     add_custom_target(re2_copy_headers_to_destination DEPENDS re2_create_destination_dir)   
    
     foreach(header_file ${RE2_HEADERS})      
        add_custom_command(TARGET re2_copy_headers_to_destination PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${header_file} ${RE2_INCLUDE_DIR}/re2)  
      endforeach ()   
    
      ADD_LIBRARY(RE2_LIB STATIC IMPORTED DEPENDS RE2)  
      SET_TARGET_PROPERTIES(RE2_LIB PROPERTIES IMPORTED_LOCATION ${RE2_STATIC_LIBRARIES})
    
    endif (NOT RE2_NAME)
    

    本文件下载存储库,在我的计算机中构建和安装库Libre2。该库具有线程库*的依赖性*(我认为所有Linux操作系统都随附此库)。

    但是,有问题:如果我是root用户,我才这样做。因为库使用了“ make install”命令并执行此操作,所以您需要成为root用户。 我的项目结构:
- bin - build - src - include - modules - re2.cmake - CMakeLists.txt
c++ cmake static-libraries static-linking
1个回答
2
投票
关注我的cmakelists.txt:

cmake_minimum_required ( VERSION 2.8.7 )

project ( project C CXX)

# version number
SET ( VERSION_MAJOR 0 )
SET ( VERSION_MINOR 0 )

SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )

# src : main
file ( GLOB SOURCES src/main.cpp )

# headers
include_directories ( "include" )

# src : libre2 - Download, build and install the library

find_package (Threads)

include ( "modules/re2.cmake" )
set(RE2_STATIC_LIBRARIES -L${RE2_LIBRARY_DIR} -l libre2.a )

# compile 
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY "../bin" )
add_executable ( project-v${VERSION_MAJOR}.${VERSION_MINOR} ${SOURCES})
target_link_libraries ( project-v${VERSION_MAJOR}.${VERSION_MINOR} ${RE2_STATIC_LIBRARIES})

add_dependencies(project-v${VERSION_MAJOR}.${VERSION_MINOR} RE2)

target_link_libraries (project-v${VERSION_MAJOR}.${VERSION_MINOR} ${CMAKE_THREAD_LIBS_INIT})

我的新
CmakeLists.txt

cmake_minimum_required( VERSION 2.8.7 ) project( simmc-agent ) # version number set ( VERSION_MAJOR 0 ) set ( VERSION_MINOR 0 ) # cpr requires c++11 set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" ) # src : main file ( GLOB SOURCES *.cpp ) # libre2 if (NOT RE2_NAME) include (ExternalProject) set(ABBREV "RE2") set(EXT_PREFIX "external/re2" ) set(${ABBREV}_NAME ${ABBREV}) set(${ABBREV}_INCLUDE_DIRS ${EXT_PREFIX}/src/re2/) set(APP_DEPENDENCIES ${APP_DEPENDENCIES} ${ABBREV}) message("Installing ${RE2_NAME} into ext build area: ${EXT_PREFIX} ...") ExternalProject_Add(RE2 PREFIX ${EXT_PREFIX} URL https://re2.googlecode.com/files/re2-20130115.tgz URL_MD5 "ef66646926e6cb8f11f277b286eac579" PATCH_COMMAND "" CONFIGURE_COMMAND "" BUILD_COMMAND make INSTALL_COMMAND "" BUILD_IN_SOURCE 1 ) set(CXXFLAGS CMAKE_CXX_FLAGS) set(${ABBREV}_LIBRARIES ${EXT_PREFIX}/src/RE2/obj/so/libre2.so) set(${ABBREV}_STATIC_LIBRARIES ${EXT_PREFIX}/src/RE2/obj/libre2.a) set_target_properties(${RE2_NAME} PROPERTIES EXCLUDE_FROM_ALL ON) endif (NOT RE2_NAME) if(RE2_INCLUDE_DIRS AND RE2_LIBRARIES) set(RE2_FOUND TRUE) endif(RE2_INCLUDE_DIRS AND RE2_LIBRARIES) if(RE2_FOUND) message(STATUS "Found RE2: ${RE2_LIBRARIES}") else(RE2_FOUND) message(FATAL_ERROR "Could not find RE2 library.") endif(RE2_FOUND) set(INCLUDES ${INCLUDES} ${RE2_INCLUDE_DIRS} ) # set(LIBS ${LIBS} ${RE2_STATIC_LIBRARIES} ) # headers include_directories ( "include" ) # test option( PRINT_JSON "Set to ON to print json objects before sending" OFF ) message(STATUS "${PRINT_JSON}: ${${PRINT_JSON}}") if ( PRINT_JSON ) add_definitions ( -DPRINT_JSON ) endif () # compile set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY "../bin" ) add_executable ( agent-v${VERSION_MAJOR}.${VERSION_MINOR} ${SOURCES} ) target_link_libraries ( agent-v${VERSION_MAJOR}.${VERSION_MINOR} ${RE2_LIBRARIES})

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.