Skip to content
GitLab
  • Menu
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • CMake CMake
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,926
    • Issues 3,926
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 18
    • Merge requests 18
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Releases
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • External wiki
    • External wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • CMake
  • CMakeCMake
  • Issues
  • #23011
Closed
Open
Created Dec 13, 2021 by Daniel Germann@dgermann

Xcode: generated project uses "-F" instead of "-iframework" for Qt

Cf. this CMake forum post.

We have a C++ project that uses Qt and we are in the process of switching from make/qmake to CMake as our build tool. Development is on macOS. When we use CMake to generate an Xcode project and then build the project, we get warnings for Qt code, usually QVector:

qvector.h:174:35: warning: implicit conversion loses integer precision: ‘typename iterator_traits<ComponentDI *const *>::difference_type’ (aka ‘long’) to ‘const int’ [-Wshorten-64-to-32]

This is a warning we explicitly enable, but we do not want to see warnings about the code of 3rd party libraries when we compile our project.

The problem seems to be that Qt frameworks are included using the -F flag instead of the -iframework flag (cf. -I vs. -isystem for includes). When building the project on the command line with CMake/make, -iframework is used.

I created a small example that shows the -F/-iframework difference. So far I haven't been able to create a small example that also shows the above warning. However, when I copy one of the compiler calls used by Xcode for our real project and execute it on the command line, I get the warning, and when I change -F to -iframework I do not get the warning.

Suppose we have a source file main.cpp with the following contents:

#include <QDebug>
#include <QVector>

int main(int argc, char** argv)
{
   QVector<int> v = { 1, 2, 3, 4, 5 };

   qWarning() << "My vector:";
   qWarning() << v;

   return 0;
}

And a CMakeLists.txt with the following contents:

cmake_minimum_required(VERSION 3.15)

project(helloworld VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_PREFIX_PATH /usr/local/Trolltech/Qt-5.15.7-64)

find_package(Qt5 COMPONENTS Core REQUIRED)

add_executable(helloworld
   main.cpp
)

target_link_libraries(helloworld Qt5::Core)

Building on the command line:

cmake ../src
make VERBOSE=1

will produce the following output:

…
/Applications/Xcode_12_4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DQT_CORE_LIB -DQT_NAMESPACE=QtFoo -DQT_NO_DEBUG -iframework /usr/local/Trolltech/Qt-5.15.7-64/lib -isystem /usr/local/Trolltech/Qt-5.15.7-64/lib/QtCoreFoo.framework/Headers … -c …/src/main.cpp
…

On the other hand, creating an Xcode project:

cmake -G Xcode ../src

then opening the generated project and compiling it will produce the following output:

…
/Applications/Xcode_12_4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ … -isystem /usr/local/Trolltech/Qt-5.15.7-64/lib/QtCoreFoo.framework/Headers … -F/usr/local/Trolltech/Qt-5.15.7-64/lib … -c …/src/main.cpp
…

So, -iframework in the first case and -F in the second case. Note that we use our own Qt namespace and library infix ("Foo" above).

Environment:

  • macOS Catalina 10.15.7
  • CMake 3.22.0
  • Xcode 12.4
  • Qt 5.15.7 (our own build)
Edited Dec 18, 2021 by Gregor Jasny
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
Time tracking