2017-01-20 13 views
1

Мой вопрос: в этот момент я связываю libre2 динамически, но я хочу сделать это статически. Я установил библиотеку в свой компьютер (sudo apt-get install libre2-dev), получил «двоичный» и связал этот двоичный «libre2.so» в своем исполняемом файле. Но я хочу git клонировать репозиторий или делать это с помощью подмодуля git, затем строить этот репозиторий и связывать его в моем проекте статически.как связать библиотеку re2 в моем проекте как статическую библиотеку с cmake

Я новичок здесь, и извините за мой плохой английский RSS'

1) моя структура проекта

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

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

#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; 

} 
+0

Чтобы скачать и построить re2 вы можете использовать 'ExternalProject_Add()'. Вы можете увидеть примеры для своего случая, посмотрев на эти два файла: [https://github.com/project-z/mutton/blob/master/ext/re2.cmake](https://github.com/project -z/mutton/blob/master/ext/re2.cmake) и [https://github.com/petewarden/tensorflow_makefile/blob/master/tensorflow/contrib/cmake/external/re2.cmake](https github.com/petewarden/tensorflow_makefile/blob/master/tensorflow/contrib/cmake/external/re2.cmake), которые также используют статическую библиотеку. – fedepad

+0

Спасибо, что помогли мне. Я попробую, когда вернусь домой. После этого я дам отзывы. –

+0

Эй, я проверил его, и у меня есть некоторые проблемы: «Невозможно было встретить -lexternal/re2/src/RE2/obj/so/libre2.so» –

ответ

0

EDIT - (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}) 
0

Мой новый 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}) 
+0

Пожалуйста, замените 'target_link_libraries (agent-v $ {VERSION_MAJOR}. $ {VERSION_MINOR} $ {RE2_LIBRARIES})' следующим образом: 'target_link_libraries (agent- v $ {VERSION_MAJOR}. $ {VERSION_MINOR} $ {RE2_STATIC_LIBRARIES}) '. Это должно связывать статическую!Если это сработает, я напишу в ответ. – fedepad

+0

Я сделал это и продолжаю работать:/То же самое:/usr/bin/ld: невозможно встретить -lexternal/re2/src/re2/obj/libre2.a –