C++ 使用名为:CDR的宏的不正确参数调用CMAKE:CDR宏
试图运行cmake时,我的.cmake文件出现此错误“CDR宏为名为:CDR的宏调用了不正确的参数” 我在Linux上使用的是完全相同的文件,从来没有出现过这个问题,它只发生在Mac上 我假设Linux和OSx具有类似的配置 有什么想法吗 以下是我得到的错误: ~/Findsmpq.cmake:20(CDR):使用不正确的参数调用CDR宏 对于名为:CDR调用堆栈的宏(最新调用优先):C++ 使用名为:CDR的宏的不正确参数调用CMAKE:CDR宏,c++,linux,macos,macros,cmake,C++,Linux,Macos,Macros,Cmake,试图运行cmake时,我的.cmake文件出现此错误“CDR宏为名为:CDR的宏调用了不正确的参数” 我在Linux上使用的是完全相同的文件,从来没有出现过这个问题,它只发生在Mac上 我假设Linux和OSx具有类似的配置 有什么想法吗 以下是我得到的错误: ~/Findsmpq.cmake:20(CDR):使用不正确的参数调用CDR宏 对于名为:CDR调用堆栈的宏(最新调用优先): ~/cmakemodules/Findsmpq.cmake:166 (列表索引)CMakeLists.txt:
~/cmakemodules/Findsmpq.cmake:166 (列表索引)CMakeLists.txt:172(查找包) 这是我的.cmake文件的代码
7 #--------------------------------------
8 # macros related to list
9 MACRO(CAR var)
10 SET(${var} ${ARGV1})
11 ENDMACRO(CAR)
12
13 MACRO(CDR var junk)
14 SET(${var} ${ARGN})
15 ENDMACRO(CDR)
16
17 MACRO(LIST_INDEX var index)
18 SET(list . ${ARGN})
19 FOREACH(i RANGE 1 ${index})
20 CDR(list ${list})
21 ENDFOREACH(i)
22 CAR(${var} ${list})
23 ENDMACRO(LIST_INDEX)
24
25 #--------------------------------------
在166号线附近
134 #--------------------------------------
135 # to find Qt choose compiler directory
136 MACRO(QT_COMPILER_LIST result2 curdir2)
137
138 FILE(GLOB children2 RELATIVE ${curdir2} ${curdir2}/*)
139
140 SET(dirlist2 "")
141
142 FOREACH(child2 ${children2})
143 if(IS_DIRECTORY ${curdir2}/${child2})
144 if(WIN32)
145 string(REGEX MATCH "^msvc[_0-9]*" QTCOMP ${child2}) #RE to match MSVC compiled libraries by default
146 endif(WIN32)
147 if(UNIX)
148 string(REGEX MATCH "^gcc[_0-9]*" QTCOMP ${child2}) #RE to match GCC compiled libraries by default (64 bit)
149 endif(UNIX)
150
151 LIST(APPEND dirlist2 ${QTCOMP})
152 endif()
153 ENDFOREACH()
154
155 SET(${result2} ${dirlist2})
156
157 ENDMACRO()
158
159 QT_COMPILER_LIST(QT_COMP_DIR ${HOME_DIR}/${QT_PREFIX}/${QT_VER_PREFIX})
160
161 message(STATUS "QT_COMP_DIR_LIST :" ${QT_COMP_DIR})
162
163 LIST(LENGTH QT_COMP_DIR len)
164 MESSAGE(STATUS "Number of Qt Compilers:" ${len})
165
166 LIST_INDEX(QT_COM_PATH ${len} ${QT_COMP_DIR}) #len specifies which compiler from the list to use
167 message(STATUS "QT COMP DIR USED:" ${QT_COM_PATH})
168
169 if(WIN32)
170 set(POSSIBLE_PREFIX_PATH ${HOME_DIR}${QT_PREFIX}/${QT_VER_PREFIX}/${QT_COM_PATH}/lib/cmake)
171 message(STATUS "QT POSSIBLE_PREFIX_PATH:" ${POSSIBLE_PREFIX_PATH})
172 endif(WIN32)
173
174 if(UNIX)
175 set(POSSIBLE_PREFIX_PATH ${HOME_DIR}/${QT_PREFIX}/${QT_VER_PREFIX}/${QT_COM_PATH}/lib/cmake)
176 message(STATUS "QT POSSIBLE_PREFIX_PATH:" ${POSSIBLE_PREFIX_PATH})
177 endif(UNIX)
178
179 find_path(CMAKE_DIR Qt5Config.cmake PATHS ${POSSIBLE_PREFIX_PATH}/Qt5)
180
181 endif()
182
183 #--------------------------------------------------------------
现在查看CMakeLists.txt中的第172行
168 #smpq qt based application
169
170 if(ENABLE_QT_GUI)
171
172 find_package(smpq)
173 if(NOT SMPQ_FOUND)
174 message(FATAL_ERROR "Could not find SMPQ")
175 endif(NOT SMPQ_FOUND)
176
177 set(CMAKE_PREFIX_PATH ${PREFIX_PATH})
178 message(STATUS "CMAKE_PREFIX_PATH" ${CMAKE_PREFIX_PATH})
179
180 find_package(Qt5 REQUIRED COMPONENTS Widgets Core Sql PrintSupport)
181
182 qt5_wrap_cpp(QtProjectLib_hdr_moc ${QtProjectLib_hdr})
183 qt5_wrap_ui(QtProjectLib_ui_uic ${QtProjectLib_ui})
184 qt5_add_resources(QtProjectLib_qrc_rcc ${QtProjectRsc_qrc})
185
186 include_directories (${PROJECT_SOURCE_DIR})
187 include_directories (${PROJECT_BINARY_DIR})
188
189 add_library (QtProjectLib STATIC ${QtProjectLib_src} ${QtProjectLib_hdr_moc} ${QtProjectLib_ui_uic})
190
191 target_link_libraries (QtProjectLib
192 Qt5::Core
193 Qt5::Gui
194 Qt5::Widgets
195 Qt5::Sql
196 Qt5::PrintSupport)
197
198 # WIN32 to suppress the console window under Windows
199 add_executable(KTAB_SMP WIN32 ${QtProjectBin_src} ${QtProjectLib_qrc_rcc})
200
201 target_link_libraries (KTAB_SMP
202 QtProjectLib
203 smp
204 ${KMODEL_LIBRARY}
205 ${KUTILS_LIBRARY}
206 ${SQLITE_LIBRARIES}
207 ${EFENCE_LIBRARIES}
208 ${TINYXML2_LIBRARIES})
209
210 if(ENABLE_COPY_QT_LIBS AND WIN32)
211 find_package(qtdlls)
212 endif(ENABLE_COPY_QT_LIBS AND WIN32)
213
214 endif (ENABLE_QT_GUI)
错误在哪一行触发?能否给出完整的错误消息,包括堆栈跟踪?汽车和CDR是非常不符合标准的。使用CMake可能可以以不同的方式更好地解决问题。对
list\u index()
的调用之一是使用未替换的空值调用cdr()
,这使它看起来像是只使用一个参数调用的。如果您试图查找有关Qt安装的信息,使用一些内省,而不是拖拽您的文件系统。Qt3和Qt4的CMake。Qt本身Qt5@usr1234567你是对的,我承认代码不是很清楚,我道歉,我只是在应该更合理的地方编辑了代码,包括行号。