В настоящее время я работаю с 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
, но я не знаю, что делать, так что основной метод не ожидается!
Если я правильно вас понял, вы пытаетесь скомпилировать два независимых приложения Proj1 и Proj2. У них нет никакой связи между собой. Они оба должны иметь main(...)
функция. И, конечно, вы не можете объявить extern
вар в этом случае. Если вы хотите создать одно приложение, то один из ваших подпроектов должен быть библиотекой, а другой подпроект должен связываться с ним. Тогда вы можете использовать внешнюю декларацию.
В Proj2.pro
объявлять TEMPLATE = lib
, И в Proj1 добавить связь с этой библиотекой, как LIBS += -lProj2
, Конечно, вы должны добавить путь к libproj2
место нахождения.
ваш proj1 должен быть lib
не app
, если вы хотите использовать extern
,
и ваш основной проект должен добавить ordered