una que programacion programa otro lenguaje incluir ejemplos definicion crear cabecera archivos archivo c++ c compilation header-files libraries

que - ¿Dónde está la implementación de los archivos de encabezado C++/C incluidos?



incluir un archivo c en otro (4)

Esto puede parecer un poco estúpido :) Pero ha estado molestando por un tiempo. Cuando incluyo algunos archivos de encabezado escritos por otros en mi programa C ++ / C, ¿cómo sabe el compilador dónde se declara la implementación de la función miembro de la clase en los archivos de encabezado?

Digamos que quiero escribir algún programa que aproveche la biblioteca OpenCV. Normalmente quisiera usar:

#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp>

Sin embargo, estos son solo archivos de encabezado que, hasta donde puedo decir, solo declara funciones pero sin implementación. Entonces, ¿cómo sabe el compilador dónde encontrar la implementación? Especialmente cuando quiero construir un archivo .so.

Hay una publicación similar. Básicamente, dijo que la biblioteca de tercera parte, especialmente producto comercial no libera el código fuente, entonces envían el archivo lib con el encabezado. Sin embargo, no dejó en claro cómo sabe el compilador dónde encontrar el archivo lib. Además, la respuesta en esa publicación mencionada, si quiero compilar el código por mi cuenta, necesitaría el código fuente de la implementación de esos archivos de encabezado. ¿Eso significa que no puedo crear un archivo .so sin el origen de la implementación?


Como los otros ya explicaron, necesita decirle a su compilador dónde buscar los archivos. Esto implica que debe saber qué ruta especificar para su compilador.

Algunos componentes proporcionan un mecanismo donde no necesita saber la ruta exacta , pero puede recuperarla automáticamente de su sistema.

Por ejemplo, si desea compilar utilizando GTK + 3, necesita especificar estos indicadores para su compilador:

CFLAGS: = -I./ `pkg-config --cflags gtk + -3.0`

LIBS: = -lm `pkg-config --libs gtk + -3.0`

Esto generará automáticamente los indicadores de ruta de biblioteca y de inclusión necesarios para GCC.


En general, la implementación se distribuye como una forma de bibliotecas compiladas previamente . Necesita decirle al compilador dónde están ubicados.

Por ejemplo, para gcc , citando el manual en línea

-llibrary -l library

Busque en la biblioteca llamada biblioteca al enlazar. [...]

y,

-Ldir

Agregue directorio dir a la lista de directorios a buscar -l .

Nota: no es necesario especificar explícitamente las bibliotecas estándar, se vinculan automáticamente. Por el contrario, si no desea que se vinculen con usted binario, debe informar al compilador pasando la opción -nostdlib .


La cadena de herramientas del compilador contiene al menos dos herramientas principales: el compilador y el editor de enlaces (es muy común denominar compilador a toda la cadena, pero estrictamente hablando es incorrecto).

El compilador está a cargo de producir código objeto a partir del código fuente disponible. En esa fase, el compilador sabe dónde ubicar los encabezados estándar, y se le puede indicar que use directorios no estándar para ubicar los encabezados. Por ejemplo, gcc usa -I para permitirle especificar algunos más directorios alternativos que pueden contener encabezados.

El editor de enlaces se encarga de producir archivos ejecutables (su uso común básico) a partir de códigos objeto. Para producir un archivo ejecutable necesita encontrar cada implementación de elementos declarados en tiempo de compilación para los cuales no proporcionó el código fuente. Estos pueden ser otros códigos de objetos, códigos de objetos en bibliotecas, etc. El editor de enlaces sabe dónde se encuentran las bibliotecas estándar y se le puede decir que le permiten especificar directorios no estándar. Por ejemplo, puede decirle a la cadena de herramientas gcc que use directorios alternativos con L que pueden contener bibliotecas. Puede ser consciente de que la edición de enlaces ahora es generalmente un proceso de dos fases: resolución de ubicación y nombre en tiempo de enlace y edición de enlace real en tiempo de ejecución (las bibliotecas dinámicas son muy comunes).

Básicamente, una biblioteca es solo una colección de código objeto. Consulte internet para ver cómo puede construir bibliotecas fácilmente desde el código fuente del código objeto.


La respuesta exacta es específica de la plataforma, pero, en general, diría que algunas bibliotecas son solo de cabecera, y otras incluyen la implementación de los métodos de la biblioteca en archivos de objetos binarios. Creo que OpenCV pertenece al segundo tipo, es decir, proporciona la implementación en archivos de objetos, ya sea para enlaces dinámicos o estáticos, y los enlaces de tu programa en contra de ellos. Si su compilación funciona, entonces ya está configurada para vincularse con esas bibliotecas. En este punto, los detalles se vuelven muy específicos de plataforma y sistema de compilación.

Tenga en cuenta que para plataformas comunes como Windows, Mac y Linux, rara vez necesita construir bibliotecas populares como OpenCV usted mismo. Usted mencionó .so archivos, lo que implica vinculación dinámica en Linux. Esta biblioteca es de código abierto, así que en teoría podría compilarla usted mismo, pero en la práctica preferiría usar la herramienta de instalación de paquetes de mi distribución (por ejemplo, apt-get o yum) para instalar opencv-dev (o algo similar) de mi distribución. repositorio.