简体   繁体   English

如何使用cmake将我的项目中的re2库像静态库一样链接

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

My question: in this moment I'm linking the libre2 dinamically, but I want to do this statically.我的问题:此时我正在动态地链接 libre2,但我想静态地执行此操作。 I installed the library in my pc (sudo apt-get install libre2-dev), got the "binary" and linked this binary "libre2.so" in my executable.我在我的电脑上安装了这个库(sudo apt-get install libre2-dev),得到了“二进制文件”并在我的可执行文件中链接了这个二进制文件“libre2.so”。 But I want to git clone the repository or to do this by git submodule, then build this repository and link it in my project statically.但我想 git clone 存储库或通过 git submodule 执行此操作,然后构建此存储库并将其静态链接到我的项目中。

I'm new here and sorry for my bad English rss'我是新来的,抱歉我的英语不好 rss'

1) my project structure 1)我的项目结构

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

2) CMakeLists.txt 2) CMakeLists.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) main.cpp 3) main.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;  

}

EDIT - (26.01.17) : Hello, guys.编辑 - (26.01.17) : 大家好。 I'm here to talk how I resolve it.我是来谈谈我是如何解决的。 Following some tips gave here, I create a file called re2.cmake :按照这里给出的一些提示,我创建了一个名为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)

This file download the repository, building and install the library libre2 in my computer.此文件下载存储库,在我的计算机中构建和安装库 libre2。 This library has a dependency for Thread library* (I thinks all linux operation system come with this library).这个库依赖于 Thread 库*(我认为所有的 linux 操作系统都带有这个库)。

But, has a problem: I only do this, if I'm a root user.但是,有一个问题:如果我是 root 用户,我只会这样做。 Because the library used the "make install" command and to do it, you need to be a root user.因为库使用了“make install”命令并且要执行此操作,您需要成为 root 用户。

my project structure:我的项目结构:

- bin
- build
- src
- include
- modules
    - re2.cmake
- CMakeLists.txt

FOllowing my 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})

My new CmakeLists.txt我的新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})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM