Search code examples
c++qtubuntucmakeconan

cmake, conan, and qt hello world project build error


I am new to StackOverflow, Conan, and CMake.

I am trying to build a hello world program that depends on Qt with CMake. I have cloned it from a public repository cmake-hello-world and compiled it successfully.

Now, I am trying to conanize this project and I have installed the Qt/5.9@bincrafters/stable jfrog-bintray component which is readily available on bintray and changed the CMakelist.txt.

This is my conan profile:

cat ~/.conan/profiles/default

[settings]
os=Linux
os_build=Linux
arch=x86_64
arch_build=x86_64
compiler=gcc
compiler.version=5
compiler.libcxx=libstdc++
build_type=Release
[options]
[build_requires]
[env]

CMakeList.txt:

cmake_minimum_required(VERSION 3.5)

project(helloworld)

# If conan is being used, configure CMake to use conan for dependencies.
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)

# Find includes in the build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Turn on automatic invocation of the MOC, UIC & RCC
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

# There may be a way to tell up front if Qt5 is going to be found, but I haven't found
# a foolproof way to do it yet, so settle for the default error message for now.
#if(NOT CMAKE_PREFIX_PATH AND NOT Qt5Widgets_DIR)
#    message(WARNING "CMAKE_PREFIX_PATH is not defined, so find_package may not work. 
Set the CMAKE_PREFIX_PATH "
#            "environment variable to the install prefix of Qt 5, either on the command line as "
#            "-DCMAKE_PREFIX_PATH=\"path/to/Qt5/lib/cmake\" or with set(CMAKE_PREFIX_PATH path/to/Qt5/lib/cmake)")
#endif(NOT CMAKE_PREFIX_PATH AND NOT Qt5Widgets_DIR)

# Add a compiler flag
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")

# Make this a GUI application on Windows
if(WIN32)
    set(CMAKE_WIN32_EXECUTABLE ON)
endif()



# Find the QtWidgets library
find_package(Qt5 REQUIRED COMPONENTS Widgets)

# Tell CMake to create the helloworld executable
add_executable(helloworld main.cpp mainwindow.cpp mainwindow.ui resources.qrc)

# Add the Qt5 Widgets for linking
target_link_libraries(helloworld ${CONAN_LIBS})

from the root of the directory, I am running these commands:

mkdir build
cd build
conan install .. --build missing
cmake ..
make

I am getting the following error:

[ 16%] Automatic moc, uic and rcc for target helloworld
[ 16%] Built target helloworld_automoc
[ 33%] Building CXX object CMakeFiles/helloworld.dir/main.cpp.o
In file included from /home/ram2020/temp/temp/working_qt_tar/Qt-CMake-HelloWorld/main.cpp:1:0:
/home/ram2020/temp/temp/working_qt_tar/Qt-CMake-HelloWorld/mainwindow.h:4:23: fatal error: QMainWindow: No such file or directory
compilation terminated.
CMakeFiles/helloworld.dir/build.make:62: recipe for target 'CMakeFiles/helloworld.dir/main.cpp.o' failed
make[2]: *** [CMakeFiles/helloworld.dir/main.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/helloworld.dir/all' failed
make[1]: *** [CMakeFiles/helloworld.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

I couldn't find much help online. Please help


Solution

  • thank you for all your answers. The below solution worked for me and this is how my CMakeList file looks like. I am posting because the below info might help others.

    cmake_minimum_required(VERSION 3.5)
    
    project(helloworld)
    
    
    # Find includes in the build directories
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    set(CMAKE_VERBOSE_MAKEFILE TRUE)
    
    # Turn on automatic invocation of the MOC, UIC & RCC
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTORCC ON)
    
    include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    conan_basic_setup()
    
    include_directories(${CONAN_INCLUDE_DIRS})
    # There may be a way to tell up front if Qt5 is going to be found, but I haven't found
    # a foolproof way to do it yet, so settle for the default error message for now.
    #if(NOT CMAKE_PREFIX_PATH AND NOT Qt5Widgets_DIR)
    #    message(WARNING "CMAKE_PREFIX_PATH is not defined, so find_package may not work. Set the CMAKE_PREFIX_PATH "
    #            "environment variable to the install prefix of Qt 5, either on the command line as "
    #            "-DCMAKE_PREFIX_PATH=\"path/to/Qt5/lib/cmake\" or with set(CMAKE_PREFIX_PATH path/to/Qt5/lib/cmake)")
    #endif(NOT CMAKE_PREFIX_PATH AND NOT Qt5Widgets_DIR)
    
    # Add a compiler flag
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
    
    # Make this a GUI application on Windows
    if(WIN32)
      set(CMAKE_WIN32_EXECUTABLE ON)
    endif()
    
    # Find the QtWidgets library
    find_package(Qt5 REQUIRED COMPONENTS Widgets)
    
    # Tell CMake to create the helloworld executable
    add_executable(helloworld main.cpp mainwindow.cpp mainwindow.ui resources.qrc)
    
    # Add the Qt5 Widgets for linking
    target_link_libraries(helloworld Qt5::Widgets)
    # target_link_libraries(helloworld ${CONAN_LIBS})
    

    This my conanfile.py

    from conan_base import <your import module here>
    
    
     class HelloWorld(your import module here):
         name = "HelloWorld"
         license = "BSD"
         author = "your name"
         url = "git@gitlab.com:<url/project>"
         description = "Base Library A of the example project."
         topics = ("<Put some tag here>", "<here>", "<and here>")
    
         def build_requirements(self):
             self.build_requires("gtest/1.8.1@bincrafters/stable")
    
         def requirements(self):
             self.requires("Qt/5.11.2@bincrafters/stable")
    
            # def package_info(self):
            #     self.cpp_info.libs = ["BaseLibBLibrary"]