¿Cómo usar funciones de diferentes proyectos de C++ en Visual Studio 2010?

Me gustaría crear dos proyectos de C++ en la misma solución en Visual Studio 2010 que puedan interactuar entre sí. He creado una solución en el directorio. C:\Users\me\Desktop\SolutionDir. Los dos proyectos han sido creados respectivamente bajo C:\Users\me\Desktop\SolutionDir\FirstProject y C:\Users\me\Desktop\SolutionDir\SecondProject.

Mi primer proyecto contiene dos archivos, un encabezado function.h y un archivo cpp function.cpp

función.h

#pragma once
void print_stuff();

función.cpp

#include "function.h"
#include <iostream>

void print_stuff() {
    std::cout << "hello world" << std::endl;
}  

Mi segundo proyecto contiene el archivo principal. main.cpp

main.cpp

#include "FirstProject\function.h"
#include <iostream>

int main(void) {
    print_stuff();

    int stop;
    std::cin >> stop;
    return 0;
}  

Agregué el directorio C:\Users\me\Desktop\SolutionDir\ en mi segundo proyecto Configuration Properties > C/C++ > General > Additional Include Directories. Todavía recibo el error clásico: error LNK2019: unresolved external symbol al llamar a la función print_stuff().

Algunas ideas ?

preguntado el 03 de mayo de 12 a las 21:05

3 Respuestas

Intente compilar el primer proyecto como una biblioteca estática en Propiedades del proyecto/Propiedades de configuración/General/Tipo de configuración.

Luego, en las propiedades de su proyecto para el segundo proyecto, deberá cambiar dos cosas:

  1. En Linker/General, es posible que deba agregar a "Directorios de bibliotecas adicionales" la carpeta donde se encuentra el primer proyecto. .lib está construído.
  2. En Linker/Input, deberá agregar a Dependencias adicionales el nombre del .lib archivo como FirstProject.lib o como se llame.

contestado el 03 de mayo de 12 a las 21:05

Muchas gracias ! Olvidé por completo especificar que FirstProject debería ser una biblioteca estática. ¡Ahora está funcionando! - vanna

Sí, necesita exportar las funciones usando _declspec(dllexport) e importarlos en el proyecto que llama a las funciones con _declspec(dllimport).

Esta dualidad se suele conseguir con una macro:

#pragma once

#ifdef FIRST_PROJECT_BUILD
#define IMPEXP _declspec(dllexport)
#else
#define IMPEXP _declspec(dllimport)
#endif

IMPEXP void print_stuff();

En la configuración de tu primer proyecto, agregas FIRST_PROJECT_BUILD a las directivas de su preprocesador. De esa manera, cuando compila el primer proyecto, le dice al compilador que la función se exportará. Sin embargo, cuando incluye el archivo en un proyecto diferente, eso no tiene FIRST_PROJECT_BUILD definido, le dice al compilador que la función se implementa en una biblioteca diferente y debe importarse.

Además, además de agregar las rutas de inclusión adicionales, debe agregar las rutas generadas .lib archivos de los proyectos que implementan las funciones al Extra dependencies en la pestaña Liner settings de la configuración de su proyecto.

contestado el 03 de mayo de 12 a las 21:05

Esto es asumiendo que el primer proyecto es un .dll - Chris A.

Deduje que el OP no sabe acerca de las DLL. No podrá decirles todo lo que necesitan saber, pero un enlace o algo podría ponerlos en camino. - Juan Dibling

@ChrisA. ¿Por qué? ¿No puedes cargar dinámicamente un exe? :) - Luciano Grigore

Tenía la impresión de que _declspec(dllexport) sólo se debe utilizar cuando se exporta desde un .dll. ¿Funcionará también si el primer proyecto es una biblioteca estática? - Chris A.

@ChrisA. IDK si es necesario para una biblioteca estática, pero no veo por qué no funcionará. - Luciano Grigore

¡Puede incluir un realPath para su directorio de inclusión! Al igual que para su primer proyecto, incluya "./../" Y lo mismo incluye el directorio para su segundo proyecto, así puede mover o copiar su directorio SolutionDir y ¡siempre funcionará!

Para su enlace no resuelto, debe agregar function.cpp y function.h en su primer y segundo proyecto. ¡Puede colocarlo en SolutionDir! Así ¡Siempre tienes dos archivos para tu primer y segundo proyecto en lugar de cuatro!

Espero eso ayude !

contestado el 03 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.