2013-12-19 80 views
1

我是使用CMake的新手(对于C++来说,对于Makefiles,C,&来说是相当新的)。我的任务是将我们当前的构建系统更改为使用CMake生成Makefiles并编译我们的代码的系统。我很难破译CMake报告的错误,并且没有运气搜索这个网站或任何sute。如果这个问题已经在其他地方得到解答,请直接告诉我,我会提前通知你。解密CMake错误

我曾试图发布显示我们当前文件结构的破坏的形象,但我没有信誉点张贴图片...

下面是我在同时运行接收错误cmake。 & 使

*[email protected]:~/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 
[email protected]:~/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 
[email protected]:~/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/arm/expat

*ADD_SUBDIRECTORY(expat) 
ADD_SUBDIRECTORY(services) 
* 

这里是的CMakeLists.txt在目录633.CMake/ARM /外籍*(这将创建库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})* 

这里是CMAK eLists.txt目录633.CMake/ARM /服务*

*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} 
+1

“expatfiles.txt只是列出了expat所需的源文件”不这样做。 CMake无法检测到这个文件的变化,所以如果你修改它,cmake将不会自动构建新添加的文件。只需在相应的CMakeLists.txt中列出它们即可。 – SirDarius

+1

您看到的错误是'make'错误,而不是'cmake'错误,这些错误看起来像来自编译器。你可能想检查你的源代码。 – SethMMorton

回答

3

此特定错误是不是因为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,并查看该应该来自哪里。它很可能是一个在头文件中定义的宏(或全局变量),您未包含它,或者它可能是您需要在编译时通过CMakeLists.txt文件提供的宏(请参阅文档: add_definitions关于如何在CMake中执行它)