Ошибка компиляции заголовочного файла libnfc cmake
Я программирую для NFC, используя библиотеку libnfc на языке Си. Я использую MinGW компилятор TDM-GCC и систему сборки с открытым исходным кодом 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 ответ
У вас файл 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, поэтому он никогда не будет встроен ни в какой исполняемый файл, поэтому вы получите неопределенную ссылку на код, который не создается...
Вам также следует добавить cmake_minimum_required и вызов проекта в файл CMakeLists.txt.
Возможно, например, вам нужно использовать SET( TARGETS ${source}.c card_objects.c )