2014-01-13 4 views
0

Спасибо, ребята, я пробовал ваши предложения, но он все еще не работает. Я хотел бы упростить свой вопрос и задать его снова.
Я использую затмение на убунту 12,04
Я поставил эти три файла в тот же C++ папку проекта
C++ отдельная компиляция, такая же функция, используемая различными исходными файлами

У меня есть три файла, main.cpp, my_lib.cpp, my_lib.h

я делаю :

//main.cpp 
#include "my_lib.h" 
// using functions from my_lib.cpp 


//my_lib.cpp 
#include "my_lib.h" 
// defining functions 

тогда я об ошибке: неопределенная ссылка функционировать
если я делаю: я:

//main.cpp 
#include "my_lib.h" 
#include "my_lib.cpp" 
// using functions from my_lib.cpp 


//my_lib.cpp 
#include "my_lib.h" 
// defining functions 

Тогда я множественным определить проблему

+3

Никогда не включайте файлы '.cpp'. Создайте для него файл '.h' и включите это. – Serdalis

+0

Почему вы не используете #include "my_lib.h"? – user534498

+0

Извините, я пропустил эту строку, поэтому проблема в том, что если я не включаю этот файл my_lib.cpp, то я не могу использовать эти функции, но если я включу его больше одного, то у меня будет несколько ошибок определения. – sflee

ответ

1

Вот как ты должен быть установлен. Плохая практика программирования включает файлы .cpp. Вместо этого вы должны включать только файлы .h в .cpp-файлы. Ошибка множественного определения возникает из того, что вы определяете my_lib.h и my_lib.cpp в том же файле. Все, что вам нужно сделать, это вызвать реализацию, и файл .cpp уже будет вызываться, поскольку в my_lib.cpp и my_class.cpp должны быть соответствующие заголовки сверху. Например: my_lib.cpp должен иметь my_lib.h сверху. my_class.cpp должен иметь my_lib.h сверху. В main.cpp все, что вам нужно сделать, это вызвать файлы .h. То же самое с my_class.cpp. Ниже показано, как вы должны настроить его.


main.cpp

включают "my_class.h"

включают "my_lib.h"



my_class.cpp

включают в себя «my_lib .h "


+0

@ 'Это плохая практика' Если мы не используем шаблоны, то мы изменим расширение на hpp и притворимся, что это никогда не происходило. – Mikhail

1

Вы не включаете .cpp-файлы в C++, потому что файлы .cpp содержат определение, а в C++ есть правило, которое вы не можете определить дважды.

Кстати,

//This is declaration, normally in .h file 
int sum(int a, int b); 
//This is definition, normally in .cpp file 
int sum(int a, int b) { return a + b; } 

Если включить файл .cpp, вы, безусловно, есть функции, определенные суммы mulptiple раз.

Вы можете включить файл .h, поскольку C++ позволяет объявлять функцию многократно.

Для вашей проблемы вы должны включить «my_lib.h».

Если функция, определенная в my_lib.cpp, не объявлена ​​в my_lib.h, вы должны объявить ее в my_lib.h.

Если вы не имеете права изменять my_lib.h, это значит, что функция my_lib.cpp не должна использоваться вне my_lib.cpp, и вам нужно пересмотреть свой дизайн.

+0

Классы могут быть определены несколько раз.Например, одно и то же определение класса, которое вы можете включить в несколько модулей. –

+0

Я неправильно использовал термин в правиле определения. Это не относится к одному правилу определения – user534498

+0

@ user534498 Вы можете определить один и тот же класс в одном и том же пространстве имен в разных модулях. –

1

Файл my_lib.cpp содержит определения функций.

В первом случае вы включили его в main.cpp и в my_class.cpp. Оба модуля теперь содержат одни и те же определения. Поэтому компоновщик выдает ошибку, потому что не знает, какие функции использовать. Вы нарушили правило определения.

Во втором случае вы не указали my_lib.cpp в my_class.cpp, а код объекта для функций был создан только один раз.

Вы не должны включать один модуль cpp в другой. Вы должны включать только заголовки.

Правильный проект будет выглядеть следующим образом

// main.cpp 
#include "my_class.h" 
#include "my_lib.h" 

// my_class.cpp 
#include "my_class.h" 
#include "my_lib.h" 
// use functions inside my_lib.cpp 

// my_lib.cpp 
#include "my_lib.h" 

EDIT: Это плохая идея, так, чтобы кардинально изменить оригинальный пост. Я думаю, проблема в том, что вы не указали для компоновщика все свои модули.

0

Как вы, вероятно, знаете, вы не можете включить один .cpp-файл в другой, поскольку это вызовет ошибку определения размера из компоновщика. Теперь, правильный способ это поставить объявление в файле заголовка:

//Utility.h 
void utility_func(); 

Определить это тело является источником файла:

//Utility.cpp 
void utility_func() 
{ 
    //... 
} 

и использовать его в других источниках. Чтобы сделать это, вы можете:

1. Включите заголовок, содержащий декларацию:

#include "Utility.h" 

2. Функция Declare вручную:

extern void utility_func(); //extern is optional here and assumed by default 

Если вы получаете ошибку о неразрешенный внешний , проверьте, соответствует ли подпись вашей функции заголовку ее определению. Вполне возможно, что функция, объявленная в заголовке, не определена нигде, потому что вы сделали опечатку или другую ошибку.

Смежные вопросы