Я новичок в использовании CMake (и довольно плохо знаком с Makefiles, C, & C ++ в целом). Мне было поручено изменить нашу текущую систему сборки на систему, использующую CMake для генерации Make-файлов и компиляции нашего кода. Я испытываю трудности с расшифровкой ошибок, о которых сообщает CMake, и мне не повезло, что они искали ни этот сайт, ни какой-либо иск по этому вопросу. Если на этот вопрос ответили в другом месте, пожалуйста, направьте меня на него, и я заранее извиняюсь.
Я попытался опубликовать изображение, показывающее разбивку нашей текущей файловой структуры, но у меня пока нет очков репутации, чтобы опубликовать изображение …
Вот ошибки, которые я получаю при запуске обоих чмокать & делать:
*chrisk@DEVSERVER:~/633.CMake$ cmake .
xmlrole.c
xmltok.c
xmlparse.c
sysMon.cpp
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chrisk/633.CMake
chrisk@DEVSERVER:~/633.CMake$ make
[ 25%] Building C object arm/expat/CMakeFiles/expat.dir/xmlrole.c.o
[ 50%] Building C object arm/expat/CMakeFiles/expat.dir/xmltok.c.o
[ 75%] Building C object arm/expat/CMakeFiles/expat.dir/xmlparse.c.o
/home/chrisk/633.CMake/arm/expat/xmlparse.c: In function 'XML_Status
/home/chrisk/633.CMake/arm/expat/xmlparse.c: In function 'XML_Status XML_Parse(XML_ParserStruct*, const char*, int, int)':
/home/chrisk/633.CMake/arm/expat/xmlparse.c:1488:14: warning: enumeration value 'XML_FINISHED' not handled in switch
Linking C static library libexpat.a
[ 75%] Built target expat
[100%] Building CXX object arm/services/CMakeFiles/services.dir/sysMon.cpp.o
In file included from /home/projects/OMAP-L137/timesys/factory-current/build_armv5l- timesys-linux-uclibcgnueabi/DSPLink-1_65_01/DSPLink- 1_65_01/dsplink/gpp/inc/usr/dsplink.h:52:0,
from /home/chrisk/633.CMake/dsp/included/flagIOBuffer.h:4,
from /home/chrisk/633.CMake/arm/framework/memoryManagerBase.h:4,
from /home/chrisk/633.CMake/arm/framework/memoryManager.h:4,
from /home/chrisk/633.CMake/arm/services/sysMon.cpp:9:
/home/projects/OMAP-L137/timesys/factory-current/build_armv5l-timesys-linux- uclibcgnueabi/DSPLink-1_65_01/DSPLink-1_65_01/dsplink/gpp/inc/usr/linkcfgdefs.h:824:37: error: 'MAX_DSPS' was not declared in this scope
In file included from /home/chrisk/633.CMake/arm/services/sysMon.cpp:16:0:
/home/chrisk/633.CMake/arm/logging/logger.h:43:17: note: the mangling of 'va_list' has changed in GCC 4.4
make[2]: *** [arm/services/CMakeFiles/services.dir/sysMon.cpp.o] Error 1
make[1]: *** [arm/services/CMakeFiles/services.dir/all] Error 2
make: *** [all] Error 2
chrisk@DEVSERVER:~/633.CMake$
Здесь CMakeLists.txt в исходном каталоге проекта:
*INCLUDE(CMakeForceCompiler)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(633.CMake)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR arm)
this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
SET(FACTORY_CURRENT /home/projects/OMAP-L137/timesys/factory-current)
SET(TOOLCHAIN_LOC ${FACTORY_CURRENT}/build_armv5l-timesys-linux- uclibcgnueabi/toolchain/bin)
specify the cross compiler
SET(CMAKE_C_COMPILER ${TOOLCHAIN_LOC}/armv5l-timesys-linux-uclibcgnueabi-g++)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_LOC}/armv5l-timesys-linux-uclibcgnueabi-g++)
SET(CMAKE_C_FLAGS "-Wall -c")
SET(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS})
where is the target environment
SET(CMAKE_FIND_ROOT_PATH /home/projects/OMAP-L137/timesys/factory-current)
SET(PROJECT_SOURCE_DIR /home/chrisk/633.CMake/)
search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/bin)
ADD_SUBDIRECTORY(arm)*
Вот CMakeLists.txt в каталоге 633.CMake / плечо / эмигранта
*ADD_SUBDIRECTORY(expat)
ADD_SUBDIRECTORY(services)
*
Вот CMakeLists.txt в каталоге 633.CMake / плечо / эмигранта * (это создает библиотеку libexpat.a как надо) и файл expatfiles.txt просто перечисляет исходные файлы, которые необходимы для экспата (то же самое относится и к сервисам CMakeLists.txt:
*FILE(READ "expatfiles.txt" contents)
STRING(REGEX REPLACE "\n" ";" contents "${contents}")
foreach(expatfile ${contents})
message("${expatfile}")
endforeach()
ADD_LIBRARY(expat ${contents})*
Вот CMakeLists.txt в каталоге 633.CMake / руки / услуги *
*INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/arm/framework ${CMAKE_SOURCE_DIR}/arm/io_master ${CMAKE_SOURCE_DIR}/arm/flagDictionary
${CMAKE_SOURCE_DIR}/arm/logging ${CMAKE_SOURCE_DIR}/dsp/included ${CMAKE_SOURCE_DIR}/dsp/mb)
INCLUDE_DIRECTORIES(${FACTORY_CURRENT}/build_armv5l-timesys-linux- uclibcgnueabi/DSPLink-1_65_01/DSPLink-1_65_01/dsplink/gpp/inc/usr)
INCLUDE_DIRECTORIES(/home/projects/OMAP-L137/timesys/factory-20120925-633/build_armv5l- timesys-linux-uclibcgnueabi/DSPLink-1_65_01/DSPLink-1_65_01/dsplink/gpp/inc/usr)
INCLUDE_DIRECTORIES(/home/projects/OMAP- L137/SDK/OMAPL137_arm_1_00_00_11/dsplink_linux_1_65_00_03/dsplink/gpp/src/inc/sys/Linux)
FILE(READ "servicesfiles.txt" contents)
STRING(REGEX REPLACE "\n" ";" contents "${contents}")
foreach(servicesfiles ${contents})
message("${servicesfiles}")
endforeach()
ADD_LIBRARY(services ${contents}
Эта конкретная ошибка не из-за CMake. Вместо этого посмотрите строку:
/home/projects/OMAP-L137/timesys/factory-current/build_armv5l-timesys-linux- uclibcgnueabi/DSPLink-1_65_01/DSPLink-1_65_01/dsplink/gpp/inc/usr/linkcfgdefs.h:824:37: error: 'MAX_DSPS' was not declared in this scope``
Проблема в пропущенном символе MAX_DSPS
, Сделайте рекурсивный grep в дереве исходного кода и посмотрите, где это MAX_DSPS
должен прийти. Вполне вероятно, что это макрос (или глобальная переменная), определенный в заголовочном файле, который вы не можете включить, или, возможно, макрос, который вам нужно предоставить во время компиляции через файл CMakeLists.txt (см. Документацию для: add_definitions о том, как это сделать в CMake)
Других решений пока нет …