2017-11-19 22 views
0

私はこの問題を2日以上解決しようとしていますが、まだ運がありません。エラー:関数への未定義の参照Android NDK

私は何が間違っているのか分かりません。簡単なNDKプロジェクトを設定するだけですが、それはすでに非常に長い時間がかかりました。

問題は、私はここで

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)' 

を取得していますが、私のルート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") 

にそれはしかし、プロジェクトをコンパイルするために開始することですエラーで終了します。

このエラーが発生する可能性がある原因として、他に何を試していいのかわかりません。

ここにソースコードがありますので、すべての構造を見ることができます。 https://github.com/DurianOdour/EcgProcessor

私は任意のヘルプFINALLY

+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>] ...) 

OFFTOPIC

次の質問は、みんながあなたは、このような問題に遭遇していない、すべてのC/C++にありますか?私は、あなたが持っていると思います!

CMake Developersこのような問題を回避するためのチェックアルゴリズムを実装するのは本当に難しいですか?

  1. は、そのための

申し訳ありませんが、逆依存関係が原因で失敗したリンキング

  • 表示するエラーメッセージのリンクライブラリの順序を確認し、すべてのターゲット・リンク・ステートメント
  • を探すすべてのライブラリとの依存関係を収集します、あなたは狂っている...あなたの時間のライオンのシェアを費やして、プログラムを書くのではなくリンク、製作、コンパイル

  • 関連する問題