2017-08-07 9 views
0

Sous automake, j'ai une bibliothèque statique tiers et une bibliothèque statique Je suis bâtiment au-dessus de celui-ci, que je veux utiliser dans executables statiquement liés à ma bibliothèque:Bibliothèque statique inclus, mais les symboles non résolus

libthird.a, libmy.a, progs... 

Je compile libmy.a avec (Makefile.am):

noinst_LIBRARIES = libmy.a 
...sources... 
libmy_a_LIBADD = libthird.a 

Quand je compiler et lier un prog qui appelle les fonctions libmy, il refuse de lier, donnant des erreurs non résolues sur tous les symboles utilisés par libthird libmy.

Comme essayer, je l'ai remplacé

libmy_a_LIBADD = libthird.a 

avec

libmy_a_LIBADD = $(LIB_THIRD_OBJS) 

dire explicitement les fichiers objets à partir desquels libthird.a est construit, et cela fonctionne. Qu'est-ce que je fais de mal dans le premier cas? libmy.a contient libthird.a dans le premier cas (c.-à-less libmy.a montre les fichiers objets et libthird.a)

Comme un autre essai, je courais ar sur libmy.a, l'alimentation il libthird.a, pour produire libmyA.a, et cela fonctionne aussi: les progs liés à libmyA.a ont des symboles libthird correctement résolus.

Ou est-ce même pas possible, car (je pense) expliqué ici: Embed all external references when creating a static library?

Répondre

0

Pourquoi ne pas:

prog_LDADD = libmy.a libthird.a 

vous devriez aussi omettez:

libmy_a_LIBADD = libthird.a 

dans ce cas parce que libmy.a est une bibliothèque de commodité statique, donc il n'y a pas de véritable point de relier davantage.

+0

Merci. Ma question n'était pas bien posée. Je l'ai édité pour mieux refléter ce que je fais. Ce que vous dites fonctionnerait dans le cas que j'ai décrit à l'origine, mais j'ai besoin de libmy.a pour contenir des symboles libthird, car je vais lier des programmes à l'extérieur du makefile que j'ai décrit. – user907323

+0

Ensuite, 'libmy.a' ne devrait probablement pas être une bibliothèque de commodité. Vous dites "J'ai besoin de libmy.a pour contenir des symboles libthird, car je vais lier des programmes à l'extérieur du makefile que j'ai décrit." _Non avoir des symboles libthird dans votre lib ne l'empêchera pas - ils lieront simplement libmy.a et libthird.a. Ou quelque chose comme [this] (https://stackoverflow.com/a/23432530/425738) pour combiner vos bibliothèques statiques dans une lib qu'ils peuvent lier (comme vous l'avez dit vous avez fait). C'est le choix de base que vous avez avec les bibliothèques statiques. – ldav1s

+0

Merci, ce dernier est ce que je cherche. Pour ce qui est de lier les exécutables avec 'libmy.a' et' libthird.a' - c'est quelque chose que je veux éviter, car 'libmy.a' est une abstraction au-dessus de l'implémentation de bas niveau de' libthird.a'. – user907323