0

C言語でlibnfcライブラリを使用してNFCのプログラミングをしています。コードをビルド/コンパイルするために、このチュートリアルに従ってインストールした TDM-GCC MinGW Compiler と CMAKE オープン ソース ビルド システムを使用しています。ソース ファイルを持つヘッダー ファイルをインクルード/インポートするプログラムをコンパイルしようとしています。ヘッダー ファイル (card_objects.h) の一部は次のとおりです。

#ifndef CARD_OBJECTS_H_
#define CARD_OBJECTS_H_
... //other code

int setApplicationID(uint8_t *rapdu, char tag[], int currentPos);
#endif

ソース コード ファイル (card_objects.c) の一部は次のとおりです。

#include "card_objects.h"
... //other code

int setApplicationID(uint8_t *rapdu, char tag[], int currentPos)
{
    ... //other code
    return currentPos;
}

両方のファイルは、メイン ファイルに対する現在のパスの include_dir/ ディレクトリにあります。次のように、メイン プログラム ファイルでヘッダー ファイルを呼び出しました。

#include "include_dir/card_objects.h"

... //othercode

int main(int argc, const char *argv[])
{
    .... //other code
    currentPos = setApplicationID(rapdu, "Application ID (AID): ", currentPos);
    ... //other code
}

上記のプログラムを自分のコンピューターでコンパイルしようとすると、次のエラーが発生します。

"... main_file.c:200: undefined reference to 'setApplicationID'"

私が間違っていた可能性があることを誰かが理解できますか?ソースファイルがなく、変数定義だけの他のヘッダーファイルがいくつかあることに注意してください。これらは問題なくコンパイルされています。これは、ヘッダー ファイルからソース ファイルへの唯一のインポートであり、機能していません。誰でも問題が発生しますか?

4

1 に答える 1

0

CMakeLists.txt ファイルが正しくありません。

これがあなたのオリジナルです:

SET(EXAMPLES-SOURCES
  main_file
  tests/test_progs
)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../libnfc)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include_dir) #this is where the two files are located

# Examples
FOREACH(source ${EXAMPLES-SOURCES})
  SET (TARGETS ${source}.c)

  IF(WIN32)
    SET(RC_COMMENT "${PACKAGE_NAME} example")
    SET(RC_INTERNAL_NAME ${source})
    SET(RC_ORIGINAL_NAME ${source}.exe)
    SET(RC_FILE_TYPE VFT_APP)
    CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/../contrib/win32/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/../windows/${source}.rc @ONLY)
    LIST(APPEND TARGETS ${CMAKE_CURRENT_BINARY_DIR}/../windows/${source}.rc)
  ENDIF(WIN32)

  ADD_EXECUTABLE(${source} ${TARGETS})
  TARGET_LINK_LIBRARIES(${source} nfc)
  TARGET_LINK_LIBRARIES(${source} nfcutils)
  INSTALL(TARGETS ${source} RUNTIME DESTINATION bin COMPONENT examples)
ENDFOREACH(source)

#install required libraries
IF(WIN32)
  INCLUDE(InstallRequiredSystemLibraries)
  CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/FixBundle.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FixBundle.cmake @ONLY)
  INSTALL(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/FixBundle.cmake)
ENDIF(WIN32)

IF(NOT WIN32)
  # Manuals for the examples
  FILE(GLOB manuals "${CMAKE_CURRENT_SOURCE_DIR}/*.1")
  INSTALL(FILES ${manuals} DESTINATION ${SHARE_INSTALL_PREFIX}/man/man1 COMPONENT manuals)
ENDIF(NOT WIN32)

2 つのターゲットを作成するFOREACH(source ${EXAMPLES-SOURCES})セクションでは、それぞれに 1 つの c ファイルしかないためSET( TARGETS main_file.c )、最初の反復とSET( TARGETS tests/test_progs.c)2 番目の反復で終了します。

card_objects.c は CMakeLists.txt ファイルのどこにも参照されていないため、実行可能ファイルに組み込まれることはありません。したがって、ビルドされていないコードへの未定義の参照が取得されます...

また、CMakeLists.txt ファイルにもcmake_minimum_requiredおよびプロジェクト呼び出しを追加する必要があります。

おそらく、たとえば、使用する必要がありますSET( TARGETS ${source}.c card_objects.c )

于 2014-11-28T09:59:19.840 に答える