2011-05-24 33 views
17

Ben daha önce derlenmiş bir C++ program var ama Jamfiles ile mucking sonra, program artık derlenmiş ve ld bir duplicate symbol error yayılan kökenini anlamak. Bu arka arkaya bjam clean çalışan elle nesneleri kaldırma ve MacOS 10.6.7 4.2.1 gcc gcc ön ucu ile tınlamak geçiş, orijinal Jamfiles döndükten sonra da devam etmiştir.bir bağlayıcı yinelenen sembol hata

programın basitçe şöyle açıklanabilir main.o bağlı bir statik kütüphaneye derlenir main.cpp ve dört dosyaları a.h,cpp ve b.h,cpp, olmasıdır. Her ikisi de, main.cpp ve b.cpp, iki farklı ara dosya aracılığıyla, off.h hatalı sembol içeren dosyaya bağlıdır, ancak ne a.h ne de a.cpp hiçbir şekilde off.h'a bağlıdır. Sormadan

, ben tüm dosyaları birden tanım korumaları (#ifndef, #define, #endif) sarılı emin yaptı ve onları eksik bir dosya buldunuz iken, bu off.h referans vermedi. Daha da önemlisi, b.hoff.h başvuran bir şey, sadece uygulama, b.cpp içermez, off.h için herhangi bir başvuru yapar. Bu yalnız beni şaşırttı.

Karm şaşkınlığımı eklemek için,numaralı telefonu b.cpp numaralı başvurudan kaldırmayı başardım ve beklendiği gibi başarıyla yeniden derledim. Ancak, referansı tekrar eklediğimde, ayrıca başarıyla derlenmiş ve nesne dosyalarını temizledikten sonra bunu yapmaya devam etmiştir. Ben, özellikle sembollerin çatışmaya girmemesi, sembollerin çoğalmasını engellediğimi ve önceden/tamamlanmamış yapılardan kurtulmuş olduğumu düşünerek, neden derlenemediğiyle ilgili bir kayıp yaşıyorum.

başarıyla programımı derlemek başardı beri

, ben herhangi bir öneri test etmek onu yeniden üretmek mümkün olacak şüpheliyim. Bununla birlikte, bunun nasıl olabileceğine meraklıyım ve eğer gelecekte bu davranışla karşılaşırsam, ne yaparsam yapmamın ötesinde, onu düzeltmek için ne yapabilirim?

+7

Sen kendini yeniden olamaz bir hata teşhis etmemizi bekliyorsunuz? –

+0

@Neil, öyle değil. Not: Bir "çözüm" e girene kadar bu problemi derlemek için sayısız girişimde bulunabiliyordum. Ve sorunun tekrar ortaya çıkmamasından dolayı cevapların daha teorik olmasını bekliyorum. Bununla birlikte, iki ayrı derleme biriminde atıfta bulunulan bir sembolün, herhangi bir çatışma olmaması gerektiğinde çatışmaya neden olabilecekleri konusunda daha iyi bir anlayış elde etmeye çalışıyorum.Ve eğer varsa, sorunu kendim teşhis etmek ve hafifletmek için alabileceğim ek adımlar. – rcollyer

+1

Bunu% 90 şans verdim, aslında aslında tüm nesne dosyalarını temizlemediniz (belki libtool veya bir şey gizli bir dizinde saklıyordu?). Yine de, eğer onu üretemezseniz, bunun altına ulaşmak için bir yol yoktur. – bdonlan

cevap

39

Bu genellikle yerine sadece o bildirmek, bir başlık dosyasında bir nesne tanımlama sonucudur. Düşünün:

h.h:

#ifndef H_H_ 
#define H_H_ 
int i; 
#endif 

a.cpp:

#include "h.h" 

b.cpp:

#include "h.h" 
int main() {} 

Bu yinelenen üretecek sembolü i. extern int i; ve kaynak kod dosyaları tam birinde tanımlamak: int i; çözeltisi başlık dosyasında nesne bildirmektir.

+2

sembolü, üstbilgideki satır içi bildirilen bir işlevdi, ancak "inline" anahtar sözcüğünden yoksundu. Bu [http://stackoverflow.com/questions/2954256/duplicate-symbol-linker-error-c-help] gerekli olmak. Ama benim çözümümdeki sorum şu ki, 'a.o' nesne dosyasında 'b.o'da bulunanla çakışacak şekilde maruz kalıyor? Anladığım kadarıyla, bu olmamalı. Neyi kaçırıyorum? – rcollyer

+2

1) Dosya kapsamında bildirilen adlar harici bağlantıya sahiptir. 2) Bir nesne, çoklu çeviri birliklerinde beyan edilebilir, ancak tam olarak bir kez tanımlanmalıdır. –

+0

daha fazla düşündüğümde, bunun sebebi çok daha iyi olmuş gibi görünüyor. Yine de yineleyemediğim sürece, bir gün niçin derlendiğine dair şaşkın kalacağım, ama bir sonraki değil. – rcollyer

İlgili konular