Linker error when calling a C function from C++ code in different VS2010 project

白昼怎懂夜的黑 提交于 2019-11-27 02:13:44

In C or C++, considering that a module may consist of multiple objects, every object should be clearly delimited. Also, every object (.c or .cpp file) should have its own header file. So, you should have one header file and one c(xx) file for the C functions (3 in your example). Also, as a general guideline, try to be consistent when naming files and macros: your header.h file uses G_FMT_H macro as include guard. So, try reorganizing your .h and .c files to something like:

functions.h:

#pragma once

#if defined (WIN32)
#if defined(FUNCTIONS_STATIC)
#define FUNCTIONS_API
#else
#if defined(FUNCTIONS_EXPORTS)
#define FUNCTIONS_API __declspec(dllexport)
#else
#define FUNCTIONS_API __declspec(dllimport)
#endif
#endif
#else
#define FUNCTIONS_API
#endif

#if defined(__cplusplus)
extern "C" {
#endif

    FUNCTIONS_API char *dtoa(double, int, int, int *, int *, char **);
    FUNCTIONS_API char *g_fmt(char *, double);
    FUNCTIONS_API void freedtoa(char*);

#if defined(__cplusplus)
}
#endif

and the corresponding implementation (functions.c):

#define FUNCTIONS_EXPORTS
#include "functions.h"

char *dtoa(double, int, int, int *, int *, char **) {
    //function statements
}

char *g_fmt(char *, double) {
    //function statements
}

void freedtoa(char*) {
    //function statements
}

2 things to notice here (besides reorganizing and renaming) in the header file:

  • The extern storage specifier for each function is gone
  • Exporting logic: your project will define now FUNCTIONS_EXPORT (from functions.c, or desirable to be a VStudio project setting - anyway, somewhere before #include "functions.h")
    • When this project (functions.c) will be compiled, the functions will be exported (due to the macro definition)
    • When the header file will be included in another project (that doesn't define FUNCTIONS_EXPORTS), the functions will be marked as imported, and the linker will search for them in the imported .lib(s) - one of them should be the one generated by this project
    • To be more rigorous, you could replace the FUNCTIONS_EXPORTS (and remove its definition from functions.c) by a macro that's automatically defined by VStudio IDE: ${YOUR_PROJECT_NAME}_EXPORTS (e.g. if your Dll project is called ExportFunctionsProject.vc(x)proj, then the macro name will be EXPORTFUNCTIONSPROJECT_EXPORTS)
    • You can check the macro name in VStudio (2010) IDE: Project Properties -> C/C++ -> Preprocessor -> Preprocessor definitions. For more details, check [MS.Docs]: /D (Preprocessor Definitions)

Similar (or related) issues:

EDIT0: Added "support" for static builds.
EDIT1: Cross platform + some corrections.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!