Discussion:
[CMake] CMake does not find an header file, and ignores the classes found in several other header files.
Toronto Andrew
2012-08-03 18:31:44 UTC
Permalink
The following is my CMakeLists file:

PROJECT(CppSampleQt01)
FIND_PACKAGE(Qt4 REQUIRED)

FIND_LIBRARY(SIMPLONLIB lv.simplon lib)
FIND_LIBRARY(SIMPLONIMGPROC lv.simplon.imgproc lib)

SET(CppSampleQt01_SOURCES include/lv.simplon.class.cpp camera.cpp main.cpp
mainwindow.cpp osdep.cpp paint.cpp)
SET(CppSampleQt01_HEADERS include/lv.simplon.class.h camera.h mainwindow.h
osdep.h paint.h)
SET(CppSampleQt01_RESOURCES icons.qrc)

SET(QExtSerialPort_HEADERS QExtSerialPort/src/qextwineventnotifier_p.h
QExtSerialPort/src/qextserialport_p.h
QExtSerialPort/src/qextserialport_global.h
QExtSerialPort/src/qextserialport.h
QExtSerialPort/src/qextserialenumerator_p.h
QExtSerialPort/src/qextserialenumerator.h)
SET(QExtSerialPort_SOURCES QExtSerialPort/src/qextserialenumerator.cpp
QExtSerialPort/src/qextserialport.cpp
QExtSerialPort/src/qextwineventnotifier_p.cpp)

if (WIN32)
SET(QExtSerialPort_SOURCES ${QExtSerialPort_SOURCES}
QExtSerialPort/src/qextserialport_win.cpp)
# add_definitions(-DWINVER=0x0501) # needed for mingw (dbt business??
LINK_LIBRARIES(${QT_QTGUI_LIBRARY} setupapi advapi32 user32)
endif(WIN32)

if (UNIX)
SET(QExtSerialPort_SOURCES ${QExtSerialPort_SOURCES}
QExtSerialPort/src/qextserialport_unix.cpp)
endif (UNIX)

if (OSX)
LINK_LIBRARIES(framework IOKit)
SET(QExtSerialPort_SOURCES ${QExtSerialPort_SOURCES}
QExtSerialPort/src/qextserialport_osx.cpp)
endif (OSX)

QT4_WRAP_CPP(CppSampleQt01_HEADERS_MOC ${CppSampleQt01_HEADERS}
${QExtSerialPort_HEADERS})

INCLUDE(${QT_USE_FILE})
ADD_DEFINITIONS(${QT_DEFINITIONS})

ADD_EXECUTABLE(CppSampleQt01 ${CppSampleQt01_SOURCES}
${QExtSerialPort_SOURCES}
${CppSampleQt01_HEADERS_MOC}
${CppSampleQt01_RESOURCES_RCC})

TARGET_LINK_LIBRARIES(CppSampleQt01 ${QT_LIBRARIES} ${SIMPLONLIB}
${SIMPLONIMGPROC})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} include QExtSerialPort/src)

And within the QExtSerialPort/src folder you find all the files under
QExtSerialPort_HEADERS and SOURCES.
However, I get these:

QExtSerialPort/src/qextserialport_p.h(0): Note: No relevant classes found.
No output generated.
//This does contain a class' declarations.
QExtSerialPort/src/qextserialport_global.h(0): Note: No relevant classes
found. No output generated.
//This too contains a class' declarations.
QExtSerialPort/src/qextserialenumerator_p.h(0): Note: No relevant classes
found. No output generated.
//Same thing.

qextserialport\src\moc_qextserialport.cpp(10): fatal error C1083: Cannot
open include file: '../../../src/qextserialport.h': No such file or
directory.
//When there is a qextserialport.h file in the QExtSerialPort/src folder.

Any input at all would be incredible, I have been mulling over this for
quite some time now.




--
View this message in context: http://cmake.3232098.n2.nabble.com/CMake-does-not-find-an-header-file-and-ignores-the-classes-found-in-several-other-header-files-tp7581066.html
Sent from the CMake mailing list archive at Nabble.com.
Rolf Eike Beer
2012-08-03 19:14:39 UTC
Permalink
Post by Toronto Andrew
PROJECT(CppSampleQt01)
FIND_PACKAGE(Qt4 REQUIRED)
FIND_LIBRARY(SIMPLONLIB lv.simplon lib)
FIND_LIBRARY(SIMPLONIMGPROC lv.simplon.imgproc lib)
SET(CppSampleQt01_SOURCES include/lv.simplon.class.cpp camera.cpp main.cpp
mainwindow.cpp osdep.cpp paint.cpp)
SET(CppSampleQt01_HEADERS include/lv.simplon.class.h camera.h mainwindow.h
osdep.h paint.h)
SET(CppSampleQt01_RESOURCES icons.qrc)
SET(QExtSerialPort_HEADERS QExtSerialPort/src/qextwineventnotifier_p.h
QExtSerialPort/src/qextserialport_p.h
QExtSerialPort/src/qextserialport_global.h
QExtSerialPort/src/qextserialport.h
QExtSerialPort/src/qextserialenumerator_p.h
QExtSerialPort/src/qextserialenumerator.h)
SET(QExtSerialPort_SOURCES QExtSerialPort/src/qextserialenumerator.cpp
QExtSerialPort/src/qextserialport.cpp
QExtSerialPort/src/qextwineventnotifier_p.cpp)
if (WIN32)
SET(QExtSerialPort_SOURCES ${QExtSerialPort_SOURCES}
QExtSerialPort/src/qextserialport_win.cpp)
list(APPEND QExtSerialPort_SOURCES QExtSerialPort/src/qextserialport_win.cpp)
Post by Toronto Andrew
# add_definitions(-DWINVER=0x0501) # needed for mingw (dbt business??
LINK_LIBRARIES(${QT_QTGUI_LIBRARY} setupapi advapi32 user32)
endif(WIN32)
if (UNIX)
elseif?
Post by Toronto Andrew
SET(QExtSerialPort_SOURCES ${QExtSerialPort_SOURCES}
QExtSerialPort/src/qextserialport_unix.cpp)
endif (UNIX)
if (OSX)
LINK_LIBRARIES(framework IOKit)
SET(QExtSerialPort_SOURCES ${QExtSerialPort_SOURCES}
QExtSerialPort/src/qextserialport_osx.cpp)
endif (OSX)
QT4_WRAP_CPP(CppSampleQt01_HEADERS_MOC ${CppSampleQt01_HEADERS}
${QExtSerialPort_HEADERS})
INCLUDE(${QT_USE_FILE})
ADD_DEFINITIONS(${QT_DEFINITIONS})
ADD_EXECUTABLE(CppSampleQt01 ${CppSampleQt01_SOURCES}
${QExtSerialPort_SOURCES}
${CppSampleQt01_HEADERS_MOC}
${CppSampleQt01_RESOURCES_RCC})
TARGET_LINK_LIBRARIES(CppSampleQt01 ${QT_LIBRARIES} ${SIMPLONLIB}
${SIMPLONIMGPROC})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} include QExtSerialPort/src)
This is likely source of the trouble: only targets after the
include_directories() line will see it. So you should move it up before the
add_executable. Also you just pass "include" here, i.e. every compiler
invocation may interpret that relative to it's current directory. You should
use absolute paths there, e.g. "${CMAKE_CURRENT_BINARY_DIR}/include".
Post by Toronto Andrew
And within the QExtSerialPort/src folder you find all the files under
QExtSerialPort_HEADERS and SOURCES.
QExtSerialPort/src/qextserialport_p.h(0): Note: No relevant classes found.
No output generated.
//This does contain a class' declarations.
QExtSerialPort/src/qextserialport_global.h(0): Note: No relevant classes
found. No output generated.
//This too contains a class' declarations.
QExtSerialPort/src/qextserialenumerator_p.h(0): Note: No relevant classes
found. No output generated.
//Same thing.
You pass it to QT4_WRAP_CPP, so moc tries to run on it. Either don't do it or
just ignore these lines.

Eike
Toronto Andrew
2012-08-04 23:58:31 UTC
Permalink
Hello, thank you for looking at my CMake issues! I really appreciate it :)

I fixed the major issue you mentioned (Moving INCLUDE_DIRECTORIES above
ADD_EXECUTABLE), however this did not seem to fix anything. I still got the
errors I was receiving prior to that change, and I used absolute paths when
linking to the include directory within my source.

I fixed this *qextserialport\src\moc_qextserialport.cpp(10): fatal error
C1083: Cannot open include file: '../../../src/qextserialport.h': No such
file or directory. * by linking to the absolute path in
moc_qextserialport.cpp, which seemed to get rid of it, however it draws up
these now:

*2>build\x\QExtSerialPort\src\moc_qextserialport.cxx(97): error C2027: use
of undefined type 'QextSerialPortPrivate'
2> QExtSerialPort/src/qextserialport.h(167) : see declaration of
'QextSerialPortPrivate'
2>build\x\QExtSerialPort\src\moc_qextserialport.cxx(97): error C2227: left
of '->_q_canRead' must point to class/struct/union/generic type*

All these errors stem from a class in qextserialport_p.h (Recall:
QExtSerialPort/src/qextserialport_p.h(0): Note: No relevant classes found.
No output generated. still shows up),

So I guess the question is still how do I get the compiler to read these
files? And why is it not reading them?

This is how the CMakeLists.txt file looks as it is right now:


*PROJECT(CppSampleQt01)
FIND_PACKAGE(Qt4 REQUIRED)

FIND_LIBRARY(SIMPLONLIB lv.simplon lib)
FIND_LIBRARY(SIMPLONIMGPROC lv.simplon.imgproc lib)

SET(CppSampleQt01_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/include/lv.simplon.class.cpp camera.cpp main.cpp
mainwindow.cpp osdep.cpp paint.cpp)
SET(CppSampleQt01_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/include/lv.simplon.class.h camera.h mainwindow.h
osdep.h paint.h)
SET(CppSampleQt01_RESOURCES icons.qrc)

SET(QExtSerialPort_HEADERS QExtSerialPort/src/qextwineventnotifier_p.h
QExtSerialPort/src/qextserialport_p.h
QExtSerialPort/src/qextserialport_global.h
QExtSerialPort/src/qextserialport.h
QExtSerialPort/src/qextserialenumerator_p.h
QExtSerialPort/src/qextserialenumerator.h)
SET(QExtSerialPort_SOURCES QExtSerialPort/src/qextserialenumerator.cpp
QExtSerialPort/src/qextserialport.cpp
QExtSerialPort/src/qextwineventnotifier_p.cpp)

if (WIN32)
#Check syntax for this. QExt... may need to be wrapped in parentheses.
LIST(APPEND QExtSerialPort_SOURCES
QExtSerialPort/src/qextserialport_win.cpp)
#SET(QExtSerialPort_SOURCES ${QExtSerialPort_SOURCES}
QExtSerialPort/src/qextserialport_win.cpp)
# add_definitions(-DWINVER=0x0501) # needed for mingw (dbt business??
LINK_LIBRARIES(${QT_QTGUI_LIBRARY} setupapi advapi32 user32)
endif(WIN32)

if (UNIX)
LIST(APPEND QExtSerialPort_SOURCES
QExtSerialPort/src/qextserialport_unix.cpp)
endif (UNIX)

if (OSX)
LINK_LIBRARIES(framework IOKit)
LIST(APPEND QExtSerialPort_SOURCES
QExtSerialPort/src/qextserialport_osx.cpp)
endif (OSX)

QT4_WRAP_CPP(CppSampleQt01_HEADERS_MOC ${CppSampleQt01_HEADERS}
${QExtSerialPort_HEADERS})

INCLUDE(${QT_USE_FILE})
ADD_DEFINITIONS(${QT_DEFINITIONS})


INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include QExtSerialPort/src)
ADD_EXECUTABLE(CppSampleQt01 ${CppSampleQt01_SOURCES}
${QExtSerialPort_SOURCES}
${CppSampleQt01_HEADERS_MOC}
${CppSampleQt01_RESOURCES_RCC})

TARGET_LINK_LIBRARIES(CppSampleQt01 ${QT_LIBRARIES} ${SIMPLONLIB}
${SIMPLONIMGPROC})
*

Once again, thank you guys!



--
View this message in context: http://cmake.3232098.n2.nabble.com/CMake-does-not-find-an-header-file-and-ignores-the-classes-found-in-several-other-header-files-tp7581066p7581076.html
Sent from the CMake mailing list archive at Nabble.com.
Rolf Eike Beer
2012-08-05 09:24:41 UTC
Permalink
Post by Toronto Andrew
Hello, thank you for looking at my CMake issues! I really appreciate it :)
I fixed the major issue you mentioned (Moving INCLUDE_DIRECTORIES above
ADD_EXECUTABLE), however this did not seem to fix anything. I still got the
errors I was receiving prior to that change, and I used absolute paths when
linking to the include directory within my source.
I fixed this *qextserialport\src\moc_qextserialport.cpp(10): fatal error
C1083: Cannot open include file: '../../../src/qextserialport.h': No such
file or directory. * by linking to the absolute path in
moc_qextserialport.cpp, which seemed to get rid of it, however it draws up
*2>build\x\QExtSerialPort\src\moc_qextserialport.cxx(97): error C2027: use
of undefined type 'QextSerialPortPrivate'
2> QExtSerialPort/src/qextserialport.h(167) : see declaration of
'QextSerialPortPrivate'
2>build\x\QExtSerialPort\src\moc_qextserialport.cxx(97): error C2227: left
of '->_q_canRead' must point to class/struct/union/generic type*
Toronto Andrew
2012-08-06 00:13:44 UTC
Permalink
Roike! I finally got it to run with a bit of manual linker error fixing!

I`ve one more question though:

CMake Warning at CMakeLists.txt:51 (ADD_EXECUTABLE):
Cannot generate a safe linker search path for target CppSampleQt01 because
there is a cycle in the constraint graph:

dir 0 is [-DEIGEN_USE_NEW_STDVECTOR]
dir 1 is [-DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET]
dir 2 is [-DBOOST_ALL_NO_LIB]
dir 3 is [-DFLANN_STATIC]
dir 4 is [ /arch:SSE2]
dir 5 is [C:/Qt/lib]
dir 13 must precede it due to link library [QtOpenGL4.lib]
dir 6 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/Boost/lib]
dir 7 is [C:/Program Files (x86)/PCL 1.6.0/lib]
dir 8 is [C:/Program Files (x86)/OpenNI/Lib]
dir 9 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/VTK/lib/vtk-5.8]
dir 10 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/FLANN/lib]
dir 11 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/Qhull/lib]
dir 12 is [C:/SimplonSample2/lib]
dir 13 is [C:/Qt/4.8.0/lib]
dir 5 must precede it due to link library [QtGui4.lib]

Some of these libraries may not be found correctly.


CMake Warning at CMakeLists.txt:51 (ADD_EXECUTABLE):
Cannot generate a safe linker search path for target CppSampleQt01 because
there is a cycle in the constraint graph:

dir 0 is [-DEIGEN_USE_NEW_STDVECTOR]
dir 1 is [-DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET]
dir 2 is [-DBOOST_ALL_NO_LIB]
dir 3 is [-DFLANN_STATIC]
dir 4 is [ /arch:SSE2]
dir 5 is [C:/Qt/lib]
dir 13 must precede it due to link library [QtOpenGLd4.lib]
dir 6 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/Boost/lib]
dir 7 is [C:/Program Files (x86)/PCL 1.6.0/lib]
dir 8 is [C:/Program Files (x86)/OpenNI/Lib]
dir 9 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/VTK/lib/vtk-5.8]
dir 10 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/FLANN/lib]
dir 11 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/Qhull/lib]
dir 12 is [C:/SimplonSample2/lib]
dir 13 is [C:/Qt/4.8.0/lib]
dir 5 must precede it due to link library [QtGui4.lib]

Some of these libraries may not be found correctly.


CMake Warning at CMakeLists.txt:51 (ADD_EXECUTABLE):
Cannot generate a safe linker search path for target CppSampleQt01 because
there is a cycle in the constraint graph:

dir 0 is [-DEIGEN_USE_NEW_STDVECTOR]
dir 1 is [-DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET]
dir 2 is [-DBOOST_ALL_NO_LIB]
dir 3 is [-DFLANN_STATIC]
dir 4 is [ /arch:SSE2]
dir 5 is [C:/Qt/lib]
dir 13 must precede it due to link library [QtOpenGLd4.lib]
dir 6 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/Boost/lib]
dir 7 is [C:/Program Files (x86)/PCL 1.6.0/lib]
dir 8 is [C:/Program Files (x86)/OpenNI/Lib]
dir 9 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/VTK/lib/vtk-5.8]
dir 10 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/FLANN/lib]
dir 11 is [C:/Program Files (x86)/PCL 1.6.0/3rdParty/Qhull/lib]
dir 12 is [C:/SimplonSample2/lib]
dir 13 is [C:/Qt/4.8.0/lib]
dir 5 must precede it due to link library [QtGui4.lib]

This stuff pops up when I try to include VTK and PCL as well, and I`m not
sure how to deal, any thoughts?

PROJECT(CppSampleQt01)

FIND_PACKAGE(PCL 1.3 REQUIRED)
FIND_PACKAGE(Qt4 REQUIRED)

FIND_LIBRARY(SIMPLONLIB lv.simplon lib)
FIND_LIBRARY(SIMPLONIMGPROC lv.simplon.imgproc lib)

SET(CppSampleQt01_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/include/lv.simplon.class.cpp camera.cpp main.cpp
mainwindow.cpp osdep.cpp paint.cpp)
SET(CppSampleQt01_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/include/lv.simplon.class.h camera.h mainwindow.h
osdep.h paint.h)
SET(CppSampleQt01_RESOURCES icons.qrc)

SET(QExtSerialPort_HEADERS QExtSerialPort/src/qextwineventnotifier_p.h
QExtSerialPort/src/qextserialport_p.h
QExtSerialPort/src/qextserialport_global.h
QExtSerialPort/src/qextserialport.h
QExtSerialPort/src/qextserialenumerator_p.h
QExtSerialPort/src/qextserialenumerator.h)
SET(QExtSerialPort_SOURCES QExtSerialPort/src/qextserialenumerator.cpp
QExtSerialPort/src/qextserialport.cpp
QExtSerialPort/src/qextwineventnotifier_p.cpp)

if (WIN32)
#Check syntax for this. QExt... may need to be wrapped in parentheses.
LIST(APPEND QExtSerialPort_SOURCES
QExtSerialPort/src/qextserialport_win.cpp)
#SET(QExtSerialPort_SOURCES ${QExtSerialPort_SOURCES}
QExtSerialPort/src/qextserialport_win.cpp)
# add_definitions(-DWINVER=0x0501) # needed for mingw (dbt business??
LINK_LIBRARIES(${QT_QTGUI_LIBRARY} setupapi advapi32 user32)
endif(WIN32)

if (UNIX)
LIST(APPEND QExtSerialPort_SOURCES
QExtSerialPort/src/qextserialport_unix.cpp)
endif (UNIX)

if (OSX)
LINK_LIBRARIES(framework IOKit)
LIST(APPEND QExtSerialPort_SOURCES
QExtSerialPort/src/qextserialport_osx.cpp)
endif (OSX)

QT4_WRAP_CPP(CppSampleQt01_HEADERS_MOC ${CppSampleQt01_HEADERS}
${QExtSerialPort_HEADERS})

FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})

INCLUDE(${QT_USE_FILE})
ADD_DEFINITIONS(${PCL_DEFINITIONS} ${QT_DEFINITIONS})

LINK_DIRECTORIES(${PCL_DEFINITIONS})

INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include QExtSerialPort/src )
ADD_EXECUTABLE(CppSampleQt01 ${CppSampleQt01_SOURCES}
${QExtSerialPort_SOURCES}
${CppSampleQt01_HEADERS_MOC}
${CppSampleQt01_RESOURCES_RCC})

TARGET_LINK_LIBRARIES(CppSampleQt01 ${PCL_LIBRARIES} ${SIMPLONLIB}
${SIMPLONIMGPROC} QVTK)

PS: I owe you a beer whenever you are in Toronto! I really appreciate all
the helpful info!



--
View this message in context: http://cmake.3232098.n2.nabble.com/CMake-does-not-find-an-header-file-and-ignores-the-classes-found-in-several-other-header-files-tp7581066p7581079.html
Sent from the CMake mailing list archive at Nabble.com.
Rolf Eike Beer
2012-08-06 07:21:55 UTC
Permalink
Post by Toronto Andrew
ADD_DEFINITIONS(${PCL_DEFINITIONS} ${QT_DEFINITIONS})
LINK_DIRECTORIES(${PCL_DEFINITIONS})
This combination is most likely wrong. Adding the same things as
compiler definitions as well as linker path entries would only be
correct when the variable is empty.

Also: don't use link_directories(). It's basically always causing
trouble. Very likely exactly the error you see. If the PCL module does
not return absolute paths to the libraries you need to link it is broken
and needs to be fixed.

Eike

Loading...