Итак, я сократил задачу до очень простой программы с пустой функцией main () и очень простым классом следующим образом.
A. cpp
#include <iostream>
class A {
public:
A() {std::cout<<"Inside A()"<<std::endl;}
};
static A a;
test. cpp
#include "A.cpp"
int main() {}
Теперь рассмотрим 2 варианта построения этой простой программы в 2 разных исполняемых файла:
Генерация программы # 1:
Скомпилируйте с помощью следующей команды (сгенерируйте файлы .o из файлов. cpp): g++ -c test.cpp A.cpp
И затем свяжитесь с помощью следующей команды: g++ test.o A.o -o linkedTest
Генерация программы # 2:
Скомпилируйте и скомпонуйте сразу с помощью следующей команды: g++ test.cpp -o test
Итак, на данный момент у нас есть 2 программы рядом с исходными файлами (вместе с промежуточными файлами .o): connectedTest и test .
Теперь выполняется программа test ( команда ./test
) только один раз выполнит конструктор класса A и напечатает текст "Inside A ()" . Напротив, при запуске программы connectedTest (команда ./linkedTest
) она дважды выполнит конструктор класса A !
Итак, мои вопросы: Почему это так? происходит? Разве один и тот же компилятор (по крайней мере) не должен генерировать одну и ту же программу из одного и того же исходного кода? Что именно происходит за сценой и как взять это под контроль? Это ожидаемое поведение компилятора / компоновщика или (неизвестная) ошибка?
Любые гуру C ++, которые могли бы пролить свет на это ...?
Для справки, мой G CC версия: g cc (Ubuntu 7.5.0-3ubuntu1 ~ 18.04) 7.5.0