Как мне связать функции из исходного файла .cpp, который также имеет «main»? - PullRequest
2 голосов
/ 20 июня 2010

Я хочу использовать некоторые функции из исходного файла .cpp, у которого есть основная функция в моем исходном файле .cpp.(Я собираю с помощью make и gcc.)

Вот правило из моего Makefile:

$(CXX) $(CXXFLAGS) $(INCLUDES) $(SRCS) $(LIBS) -o $@

А вот вывод (с некоторыми именами, измененными, чтобы отвлечь внимание):

$ make foo
g++ -g -Wall -m32 -Ilinux/include foo.cpp bar.cpp -o foo
/tmp/ccJvCgT3.o: In function `main':
/home/dspitzer/stuff/bar.cpp:758: multiple definition of `main'
/tmp/ccUBab2r.o:/home/dspitzer/stuff/foo.cpp:68: first defined here
collect2: ld returned 1 exit status
make: *** [foo] Error 1

Как указать gcc, что я хочу использовать main из foo.cpp?

Обновление: Я должен был добавить, что "bar.cpp" is "чужой "код", и у него есть своя основная причина.(Похоже, я должен работать с этим кем-то другим, чтобы он разделил общие функции в отдельный файл.)

Ответы [ 4 ]

5 голосов
/ 20 июня 2010

то, что вы могли бы сделать, это обернуть каждую функцию main () в блок #ifdef, а затем использовать командную строку, чтобы определить символ, который будет вызывать использование соответствующего main.

#ifdef USE_MAIN1
int main(void)
{

}
#endif

Затем убедитесь, что в командной строке gcc добавлено что-то вроде этого

-DUSE_MAIN1

Или просто реструктурируйте свой код!

2 голосов
/ 20 июня 2010

Дело не в том, какой main использовать в качестве "основного", потому что вы даже не зайдете так далеко.

У вас не может быть переопределений функций, это нарушает правило единого определения.Точно так же вы не можете сделать:

void foo(void)
{
    // number one
}

void foo(void)
{
    // number two
}

// two foo's? ill-formed.

Вы не можете попытаться скомпилировать несколько main.Вам нужно будет удалить остальные.

1 голос
/ 20 июня 2010

Похоже, я должен работать с этим кем-то еще, чтобы он разделил общие функции в отдельный файл

Точно, это лучший вариант. Если вам обоим нужны отдельные main s для тестирования, различных продуктов или по другим причинам, выделите обычно используемый код и main s в отдельные файлы и используйте только тот, который вам нужен, в соответствии с некоторыми настройками сборки.

1 голос
/ 20 июня 2010

Самое простое было бы удалить второй основной (...) {...} и оставить остальные функции.Это легко решает проблему

...