2017-11-19 8 views
0

내가 두 개 이상의 일이 문제를 해결하기 위해 노력 해왔다를 기능 정의되지 않은 참조를하지만.가져 오는 동안 오류가 없습니다 : 운이 여전히 안드로이드 NDK

나는 아무 생각도 잘못이 무엇인지, 내가 간단한 NDK 프로젝트를 설정하는 단지 필요가 없습니다, 그러나 이미 엄청난 시간을 촬영하고있다.

문제는 내가하지만, 내 루트 CMakeLists

# Cmake Minimum Version 
cmake_minimum_required(VERSION 3.4.1) 
project(EcgProcessing) 
# Add nested cmake files 
include(libs/CMakeLists.txt) 

include_directories(${CMAKE_CURRENT_SOURCE_DIR}) 

# ECG Audio Processor library 
add_library(ecg-signal-processor-demodulator SHARED 
      demodulator.cpp) 
add_library(ecg-signal-processor-qrsdetection SHARED 
      qrsdetection.cpp) 
# Link 

target_link_libraries(
      firpm_d 
      log 
      android 
      ecg-signal-processor-demodulator 
      ecg-signal-processor-qrsdetection) 

그리고 libs와 디렉토리 그것은 프로젝트를 컴파일하기 시작

# Cmake Minimum Version 
cmake_minimum_required(VERSION 3.4.1) 
set(LIBS_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) 
#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/Eigen/) 
MACRO(ADD_SUBLIB libname source_ext) 
    #Compute required sources 
    set(sublib_path "${LIBS_DIRECTORY}/${libname}") 
    file(GLOB_RECURSE sublib_sources "${sublib_path}/src/*.${source_ext}") 
    #Create library 
    IF(sublib_sources) 
    ADD_LIBRARY(${libname} SHARED ${sublib_sources}) 
    ENDIF() 
    #add this library's header folder to the global include set 
    INCLUDE_DIRECTORIES("${sublib_path}/include") 
    INCLUDE_DIRECTORIES("${sublib_path}/") 
    link_directories(${sublib_path}) 
ENDMACRO(ADD_SUBLIB) 

ADD_SUBLIB(firpm_d "cpp") 
ADD_SUBLIB(eigen "cpp") 

에서

다음

error: undefined reference to 'firpm(unsigned int, std::vector<double, std::allocator<double> > const&, std::vector<double, std::allocator<double> > const&, std::vector<double, std::allocator<double> > const&, double, int)' 

입니다 얻고 있다는 것입니다 오류로 끝납니다. 이 오류가 발생할 수 있습니다 무엇

, 나는 다른 시도 무엇인지 전혀 모른다. 당신이 모든 구조를 볼 수 있도록 여기에

는 소스 코드입니다. https://github.com/DurianOdour/EcgProcessor

내가 어떤 도움 마침내

+0

'firpm' 심볼을 정의하는 것은 무엇이든간에 링크하지 않습니다. * 또는 * 잘못된 순서로 링크하고 있으므로 링크를 제공하는 objct 파일이나 라이브러리 앞에 링커가 심볼을 표시하지 않습니다 (예, 링크 순서가 중요합니다). –

+0

@JesperJuhl, 귀하의 의견을 주셔서 감사합니다, 전 firpm 헤더 파일뿐만 아니라 소스 파일을 ADD_SUBLIB 매크로를 사용하여 포함하고 있습니다,이 함수는 pm.h 파일에 위치하고 있습니다. – bxfvgekd

+0

헤더가 중요하지 않습니다. 중요한 것은 파일을 사용하는 파일과 관련하여 링크 행에서 발생하는 * 및 * 함수를 구현하는 파일입니다. 기호 *를 사용하는 파일 *은 일반적으로 기호를 제공하는 * 파일 앞에 * 언급되어야합니다. –

답변

0

에 대한 감사하겠습니다! 해결책을 찾았습니다. 여기이 문제는 연결 라이브러리의 잘못된 순서로했다

Android ndk(cmake): 'undefined reference to `__android_log_write' when using log api in the second jni library

입니다.

이 코드는 큰

# Link 
target_link_libraries(
      ecg-signal-processor 
      log 
      android 
      firpm_d) 

첫 번째 인수 종속성을 필요로하는 라이브러리해야 작동합니다.

target_link_libraries(<target> [item1 [item2 [...]]] 
         [[debug|optimized|general] <item>] ...) 

논외

다음 질문은 모든 C/C++이고, 사람은 혹시 발생하지 않은 등의 문제? 나는 짐작한다, 당신은 가지고있다!

CMake Developers는 이러한 문제를 방지하기 위해 검사 알고리즘을 구현하기 정말 어렵다?

  1. 가에 대한

죄송 역 종속성으로 인해 실패를 연동

  • 표시 오류 메시지 연결 라이브러리의 순서를 확인 모든 대상 링크 문
  • 찾기 모든 라이브러리 및 종속성을 수집 , 너희들은 미쳤다 ... 프로그램 작성 대신 연결, 작성, 컴파일하는 시간의 사자비를 쓰다