ile bağlantıda "çoklu tanımlı semboller" ile nasıl dolaşılır gcc 2.95.3'e sahip eski bir sistem kullanıyorum, birbirleriyle hiçbir ilgisi olmamasına rağmen, iki nesnede bağlantı kurmak zorundayım benzer şekilde adlandırılmış yöntemler. Bunlardan hiçbirini yeniden adlandıramam, ama umarım onları bağlayıcıya sahip olmamak için onları inşa etmenin bir yolu vardır. Şikayet ettiği yöntemlerin her biri, nesnenin içindeki sınıflar tarafından içsel olarak adlandırılır. Ne yapabilirim?gcc
Q
gcc
5
A
cevap
9
tam bir GNU toolchain varsa (Ben doğru sorununuzu anladım varsa), böyle objcopy
, kullanarak soruna gerekir: Burada
iki çok benzer nesnelerdir, "foo "ve 'clash
adında bir sembol ihracat her ikisi de bar', - dahili olarak kullanılan, ancak gerçekten hiç ihraç edilecek gerekmez:
$ cat foo.c
#include <stdio.h>
void clash(char *s) { printf("foo: %s\n", s); }
void foo(char *s) { clash(s); }
$
ve
$ cat bar.c
#include <stdio.h>
void clash(char *s) { printf("bar: %s\n", s); }
void bar(char *s) { clash(s); }
$
Yani
$ gcc -Wall -c foo.c
$ gcc -Wall -c bar.c
$ gcc -Wall -c main.c
$ gcc -o test main.o foo.o bar.o
bar.o: In function `clash':
bar.c:(.text+0x0): multiple definition of `clash'
foo.o:foo.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
$
birinde clash
görünürlüğünü değiştirmek için objcopy
kullanın (veya: onları bir arada Bağlama
$ cat main.c
extern void foo(char *s);
extern void bar(char *s);
int main(void)
{
foo("Hello");
bar("world");
return 0;
}
$
çalışmaz:
Ve burada her ikisini de kullanmak istediği ana kod, var !
$ objcopy --localize-symbol=clash bar.o bar2.o
$
Şimdi değiştirilmiş nesne ile başarıyla bağlayabilir - ve program olarak davranır: Her iki, nesnelerden) seviyorsanız
$ gcc -o test main.o foo.o bar2.o
$ ./test
foo: Hello
bar: world
$
Nesne oluşmadan önce yerel nasıl belirleyebilirim? Kodda ideal olarak, ama belki de nesnenin bir parçası olarak derlenebilir? – CptanPanic
Çatışma işlevi yalnızca tek bir dosyada kullanılıyorsa, hiç dışa aktarılmaya ihtiyaç duymaz, bu yüzden "statik" çalışmalıdır. Bu, yukarıdaki önemsiz örneğimle çalışacaktır. (Asıl kaynağı değiştiremeyeceğinizi ve bunun yerine, nesneleri yeniden adlandırabileceğinizi söylediğinizde, nesnelerle yeniden çalışmanız gerektiğini varsaydım.) Daha önceki bir bağlantı aşamasında nesneler arasındaki referanslar için dışa aktarılan sembollere * ihtiyacınız varsa * (e, g, kısmi bir nesneyi veya bir kütüphaneyi birbirine bağlar), daha sonra işler daha zor olurdu ve onu sıralamak, inşa sürecinin daha ince ayrıntılarına bağlı olacaktır. –