2017-10-02 2 views
0

J'essaie de créer une bibliothèque partagée jni. J'utilise boost bibliothèque dans le code de cette bibliothèque.C++ Comment lier des librairies boost avec ma librairie partagée pour travailler sur la machine cible?

Je réussis à rendre la bibliothèque partagée sur la machine de développement et les tests effectués.

Je fais le dossier boost lib qui a libboost _ *. Donc les fichiers sur la machine cible et l'ajoutent à LD_LIBRARY_PATH. Donc, j'essaie de tester sur la machine cible (même plate-forme OS avec machine de développement) mais la machine cible ne peut pas la lier.

Alors, mon programme java trouver mon .donc (libsample.so) mais libsample.so ne peut pas trouver la bibliothèque Boost et lancer un message (non défini symbole: _ZTIN5boost6detail16thread_data_baseE)

Comment puis-je résoudre ce problème?

  1. Je veux emballer les boost sur d'abord des bibliothèques ma bibliothèque partagée
  2. ou je veux lier dynamiquement avec la bibliothèque Boost avec mon libarary partagé.

CMakeLists.txt mon projet suivant

cmake_minimum_required(VERSION 3.0) 
### This CMakeLists.txt : Root CMake of this project 
################## complie settings of this project ################## 
set(ARTIFACT_NAME "sample-plugin") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread ") 
add_definitions("-Wno-deprecated-declarations") 
add_definitions("-Wno-write-strings") 
################## Boost Settings ################## 
set(Boost_NO_SYSTEM_PATH ON) 
set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME ON) 
set(BOOST_INCLUDE_DIR "${BOOST_ROOT}/boost") 
include_directories(${BOOST_INCLUDE_DIR}) 
link_directories(${BOOST_INCLUDE_DIR}) 
link_directories(${BOOST_LIBRARY_DIR}) 
find_package(Boost 1.58.0 REQUIRED) 
include_directories("$ENV{JAVA_HOME}/include") 
if (WIN32) 
include_directories("$ENV{JAVA_HOME}/include/win32") 
else() 
include_directories("$ENV{JAVA_HOME}/include/linux") 
endif() 
add_library(${ARTIFACT_NAME} SHARED ${SOURCES}) 
target_link_libraries(${ARTIFACT_NAME} ${Boost_LIBRARIES}) 
+0

Vous devez créer Boost en tant que bibliothèque statique et créer votre objet partagé JNI en le liant à cela. Je crains de ne pas en savoir assez sur CMake ou Boost pour donner une réponse correcte à cette question - mais cela peut être suffisant pour que vous puissiez vous en assurer. (Si vous le * faites *, s'il vous plaît répondez à votre propre question - cela est parfaitement légitime, et permet aux autres de trouver la solution à l'avenir.) –

+0

Merci, je le résous suivant votre approche. J'ai répondu à ma question, y compris la source cmake. –

Répondre

0

Merci, Martin Bonner.

Je résous ce problème.

Voici mon CMakeLists.txt édité

################## complie settings of this project ################## 
set(ARTIFACT_NAME "sample-plugin") 
#set(CMAKE_CXX_STANDARD 11) # 아래에 -std=c++11 옵션과 중복 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -shared -fPIC -std=c++11 -pthread ") 
set(CMAKE_POSITION_INDEPENDENT_CODE ON) 
add_definitions("-Wno-deprecated-declarations") 
add_definitions("-Wno-write-strings") 
################## Boost Settings ################## 
set(Boost_NO_SYSTEM_PATH ON) 
set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME ON) 
set(BOOST_INCLUDE_DIR "${BOOST_ROOT}/boost") 
include_directories(${BOOST_INCLUDE_DIR}) 
link_directories(${BOOST_INCLUDE_DIR}) 
link_directories(${BOOST_LIBRARY_DIR}) 
unset(Boost_INCLUDE_DIR CACHE) 
unset(Boost_LIBRARY_DIRS CACHE) 
find_package(Boost 1.58.0 REQUIRED COMPONENTS thread date_time filesystem system program_options) 
################## Target Settings ################## 
add_library(${ARTIFACT_NAME} SHARED ${SOURCES}) 
set_target_properties(${ARTIFACT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) 
target_link_libraries(${ARTIFACT_NAME} ${Boost_LIBRARIES}) 

Avant cette course cmake, je recompile bibliothèques Boost avec -cxxflags = -fPIC en raison de this issue

Je fais .donc bibliothèque, y compris succčs coup de pouce bibliothèques comme statique en elle.

+0

Je ne peux pas * réellement * voir le changement. –

+0

Désolé, je ne pouvais pas lire ce post si longtemps. Les points de changement sont 2. (1) cache non sécurisé Boost. (2) POSITION_INDEPENDENT_CODE (fPIC). Pour cette option, j'ai dû recompiler les bibliothèques boost avec -fPIC. –