2014-10-12 3 views
0

Мне нужно создать единую общую библиотеку из нескольких объектных файлов. Допустим, что файл объекта Obj1.o и Obj2.o хранятся под obj_folder и оба используют общую функцию foo(). функция foo() определена в другом файле cpp и позволяет называть его foo.cpp. Объект foo.cpp также присутствует в obj_folder.Множественное определение символа при создании общей библиотеки со статическими библиотеками

Сценарий, как показано ниже:

In obj1.cpp 
void func1() 
{ 
int timestamp =foo(); 
} 

in obj2.cpp 
void func2() 
{ 
int timestamp = foo(); 
} 

Оба файла имеют свои obj1.o и obj2.o строить отдельно. То, что я думаю здесь, и obj1.o и obj2.o, статически создает код для foo(), а при построении компоновщика просто не может найти, с какого объекта он должен выбрать foo().

здание разделяемый объект project.so я использую следующую команду -

gcc -shared -fPIC obj_folder/*.o -o project.so 

здания общего объекта я вижу сообщение об ошибке -

Multiple definition of foo() 

Как я могу решить этот символ столкновения и построить свою общую librray?

+0

Нужны ли Obj1 и Obj2 собственные копии foo? Если это так, вы должны определить только одну копию (либо в obj1, либо в obj2, но НЕ для обоих), поместите прототип для foo в заголовок, используя ключевое слово 'extern' (и включите его, когда это необходимо). –

+0

вы просто не можете определить 2 раза одну и ту же функцию в одной проге или lib. Вы действительно определили его 2 раза? Зачем? – Klaus

+0

Я немного изменил свой вопрос. Я дал больше света на мое понимание ситуации. – user3401643

ответ

0

Multiple определение Foo()
Как я могу решить эту символ столкновения и построить свой общий librray?

К сожалению, вы не предоставили достаточно информации, чтобы ответить на этот вопрос.

Ваше описание означает, что foo определено в foo.o, но если бы это было так, вы бы не получили ошибку ссылки, которую вы получаете.

Первый шаг, чтобы выяснить, где foo is Фактически определено. Вот рецепт, чтобы сделать так:

nm -A obj_folder/*.o | grep ' foo$' 

Для ошибки связи имело смысл, должно быть два отдельных .o файлы с foo, определенные в каждом из них. При связывании библиотеки вы должны будете избавиться от одного из них.

P.S. Не вызывайте каталогов «папка».

P.P.S. Связывание библиотеки следующим образом: gcc ... obj_folder/*.o -o project.so - очень плохая идея (TM). Изучите и используйте make.

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