如何在我的项目中链接 re2 库,就像静态库一样与 cmake 链接

how to link re2 library in my project like a static library with cmake

本文关键字:链接 静态 cmake 一样 我的 项目 re2      更新时间:2023-10-16

我的问题:在这一刻,我正在动态地链接libre2,但我想静态地执行此操作。我在我的电脑中安装了该库(sudo apt-get install libre2-dev),获取了"二进制文件"并在可执行文件中链接了这个二进制文件"libre2.so"。但是我想 git 克隆存储库或通过 git 子模块执行此操作,然后构建此存储库并将其静态链接到我的项目中。

我是新来的,对不起我的英语不好 rss'

1) 我的项目结构

- bin
- build
- external
    - re2
- main.cpp
- CMakeLists.txt
- README.md  

2) CMakeList.txt

cmake_minimum_required( VERSION 2.6 )
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 )  
# linking res library dinamically  
set(RE2_LIBRARIES -L${RE2_LIBRARY_DIR} -l libre2.so)  
# src : collect functions - depend on OS  
if ( WIN32 )  
    file ( GLOB SOURCES ${SOURCES} src/windows/*.cpp )  
else ()     # if( UNIX )  
    file ( GLOB SOURCES ${SOURCES} src/linux/*.cpp )  
endif ()  
# 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_LIBRARY} )

3) 主要.cpp

#include <iostream>     
#include <re2/re2.h>
using namespace std;  
using namespace re2;
int main (int argc, char **argv) {  
    cout << "hello world" << endl;
 int matchResult;
 matchResult = RE2::FullMatch("hello", "h.*o"); 
 cout << "matchResult = " << matchResult << endl;  
   return 0;  
}

编辑 - (26.01.17) : 大家好。我在这里讨论我如何解决它。按照这里给出的一些提示,我创建了一个名为 re2.cmake 的文件:

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

关注我的 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})