libnfc cmake头文件编译错误

时间:2014-11-27 15:25:19

标签: c cmake nfc tdm-mingw lib-nfc

使用C语言的libnfc库为NFC编程。我使用TDM-GCC MinGW编译器和我在this tutorial之后安装的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'"

任何人都可以弄清楚我做错了什么吗?请记住,我有一些其他头文件没有源文件,只是变量定义,正在编译没有问题。这是唯一的头文件源文件导入,它不起作用。有人看到问题吗?

1 个答案:

答案 0 :(得分: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)

FOREACH(source ${EXAMPLES-SOURCES})部分中,您创建了两个目标,每个目标只有一个c文件,因此您在第一次迭代中会得到SET( TARGETS main_file.c ),而在第二次迭代时会得到SET( TARGETS tests/test_progs.c)

card_objects.c未在CMakeLists.txt文件中的任何位置引用,因此它永远不会内置到任何可执行文件中,因此您将获得对未构建的代码的未定义引用...

您还应该向CMakeLists.txt文件添加cmake_minimum_requiredproject调用。

也许您需要使用SET( TARGETS ${source}.c card_objects.c )