gpt4 book ai didi

c - libnfc cmake头文件编译错误

转载 作者:行者123 更新时间:2023-11-30 17:24:52 24 4
gpt4 key购买 nike

我正在使用 C 语言的 libnfc 库进行 NFC 编程。我正在使用 TDM-GCC MinGW 编译器和 CMAKE 开源构建系统,我按照 this tutorial 安装了它用于构建/编译代码。我正在尝试编译我的程序,其中包含/导入具有源文件的头文件。头文件(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'"

有人能弄清楚我可能做错了什么吗?请记住,我还有一些其他头文件,没有源文件,只有变量定义,编译时没有问题。这是唯一的头文件-源文件导入,但它不起作用。有人发现问题吗?

最佳答案

您的 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( TARGETStests/test_progs.c) 在第二次迭代中。

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

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

例如,您可能需要使用 SET( TARGETS ${source}.c card_objects.c )

关于c - libnfc cmake头文件编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27174053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com