Qt не распознает другие подпроекты

В настоящее время я работаю с QT-Creator на MacOS, и сейчас я немного застрял на двух точках. У меня есть основной проект и два подпроекта. Пока это работает нормально.

Файл .pro основного проекта выглядит так:

//...
TEMPLATE = subdirs
SUBDIRS += Proj1
SUBDIRS += Proj2

Proj1.pro файл выглядит так:

TARGET = Proj1
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += someclass1.cpp
HEADERS += someclass1.h

Proj2.pro выглядит аналогично, за исключением части SOURCES и HEADERS:

//...
SOURCES += someclass2.cpp main.cpp
HEADERS += someclass2.h

Теперь к интересной части:

мой someclass1.cpp содержит глобальную переменную и выглядит так:

#include "someclass1.h"int g_something = 18;
SomeClass1::SomeClass1() {}

мой someclass2.cpp пытается получить доступ к этой глобальной переменной через ключевое слово extern:

#include "someclass2.h"#include "../Proj1/someclass1.h"#include <stdio.h>
extern int g_something;
SomeClass2::SomeClass2() {
printf("g_something: %d\n", g_something);
}

Когда я пытаюсь скомпилировать, я получаю 2 ошибки:

Undefined symbols for architecture x86_64:
"_g_something", referenced from:
SomeClass2::SomeClass2() in someclass2.o ...

а также

Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o

  • Я знаю, что первая ошибка возникает при использовании g_something от someclass1 без надлежащей ссылки Proj1 в Proj2 но Я не знаю, как сказать компоновщику, что я использую этот другой подпроект

  • Я предполагаю, что вторая ошибка есть, потому что у меня нет основного метода, определенного в проекте Proj1, но я не знаю, что делать, так что основной метод не ожидается!

0

Решение

Если я правильно вас понял, вы пытаетесь скомпилировать два независимых приложения Proj1 и Proj2. У них нет никакой связи между собой. Они оба должны иметь main(...) функция. И, конечно, вы не можете объявить extern вар в этом случае. Если вы хотите создать одно приложение, то один из ваших подпроектов должен быть библиотекой, а другой подпроект должен связываться с ним. Тогда вы можете использовать внешнюю декларацию.

В Proj2.pro объявлять TEMPLATE = lib, И в Proj1 добавить связь с этой библиотекой, как LIBS += -lProj2, Конечно, вы должны добавить путь к libproj2 место нахождения.

2

Другие решения

ваш proj1 должен быть libне app, если вы хотите использовать extern,
и ваш основной проект должен добавить ordered

1

По вопросам рекламы [email protected]