Como un aparte, el artículo vinculado por @vcldeveloper tiene una buena explicación de algunos de los problemas comunes. El truco de proporcionar funciones C RTL faltantes en el código Pascal es excelente y mucho más rápido que intentar vincular las funciones necesarias como archivos C, o incluso como archivos .obj.
Sin embargo, tengo la sospecha de que sé lo que está sucediendo aquí. Utilizo este mismo enfoque, pero de hecho tengo más de 100 archivos .obj en la unidad. Me parece que cuando agrego nuevos, obtengo el mismo error de enlazador que tú. La forma en que lo soluciono es intentar volver a ordenar mis instrucciones de $ LINK. Trato de agregar los nuevos archivos obj uno por uno y siempre he podido, por fin, solucionar este problema.
Si sus archivos C son totalmente independientes, puede poner cada uno en una unidad diferente y el enlazador se encargará de eso. Sin embargo, dudo que ese sea el caso y de hecho sospecho que si realmente fueran independientes, entonces este problema no ocurriría. Además, es conveniente tener las instrucciones de $ LINK en una sola unidad, de modo que las funciones de RTL que deban suministrarse puedan suministrarse una sola vez (deben aparecer en la misma unidad que las instrucciones de $ LINK).
Esta singularidad en el enlazador estuvo presente en Delphi 6 y está presente en Delphi 2010.
EDIT 1: La realización ha caído en la cuenta de que este problema se debe probablemente a Delphi usando un solo pase del compilador . Sospecho que el error de "referencia externa faltante" se debe a que el compilador procesa los archivos .obj en el orden en que aparecen en la unidad.
Supongamos que a.obj aparece antes que b.obj y, sin embargo, a.obj llama a una función en b() b.obj. El compilador no sabría dónde b() reside en el punto donde necesita reparar la llamada a la función. Cuando encuentre el tiempo, intentaré probar si esta hipótesis es al menos plausible.
Finalmente, otra forma fácil de resolver el problema sería combinar a.c, b.c y c.c en un único archivo C, lo que creo que evitaría este problema para el OP.
Editar 2: He encontrado otra pregunta desbordamiento de pila que cubre esta planta: stackoverflow.com/questions/3228127/why-does-the-order-of-linked-object-file-with-l-directive-matter
Datos 3: He encontrado otra manera verdaderamente maravillosa para evitar este problema.Cada vez que el compilador se queja
[DCC Error] Unit1.pas(1): E2065 Unsatisfied forward or external declaration: '_a'
simplemente hay que añadir, en la sección de implementación de la unidad, una declaración así:
procedure _a; external;
Si se trata de una rutina que desea llamar desde Delphi entonces claramente es necesario que la lista de parámetros, las convenciones de llamada, etc. sean correctas. De lo contrario, si se trata de una rutina interna del código externo, puede ignorar la lista de parámetros, las convenciones de llamadas, etc.
Según mi leal saber y entender, esta es la única forma de importar dos objetos que se refieren entre sí en de una manera circular. Creo que declarar un procedimiento externo de esta manera es similar a hacer una declaración directa. La diferencia es que la implementación es provista por un objeto en lugar del código Pascal.
Ahora he podido agregar un par de herramientas más a mi arsenal: ¡gracias por hacer la pregunta!
Supongo que "b_function()" o "c_function()" no se encuentra en ninguno de los tres archivos de objeto. Usted asume que el problema está relacionado con vincular múltiples archivos de objeto y demostró que puede vincular un archivo. ¿Intentó vincular, por ejemplo, solo "b.obj" y solo importó "b_function()"? –
Quizás este artículo de Rudy Velthuis podría ayudar: http://rvelthuis.de/articles/articles-cobjs.html – vcldeveloper