我有一个 C++ 程序,它必须使用基于 C 的 API 来完成特定任务。如果我在我的程序中只包含一个 cpp,我完全没有问题。但是,如果我包含在头文件中(我需要在其中使用某些类型),我会收到链接器的重新定义错误。
这是由于在外部库(带有已编译 dll 的 C 头文件)头文件中进行了一些类型定义。我正在寻找这个问题的任何可能的解决方案。
当我搜索所有内容时,我似乎只能找到 header 保护内容(和#pragma once),但这些都不是问题的解决方案,因为我发现的是单独编译单元中的多个定义,这些定义在链接时会发生冲突.
我在考虑 extern,但发现我无法使用 header 中定义的任何类型作为 C++ 类中的成员,而这正是我想要做的。
Output for building on Warning Level 4
Warning 1 warning C4273: 'getwchar' : inconsistent dll linkage c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h 615 1 project-test
Warning 2 warning C4273: 'putwchar' : inconsistent dll linkage c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h 617 1 project-test
Warning 3 warning C4273: 'getwchar' : inconsistent dll linkage c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h 615 1 project-test
Warning 4 warning C4273: 'putwchar' : inconsistent dll linkage c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h 617 1 project-test
Warning 5 warning C4100: 'data' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 8 1 project-test
Warning 6 warning C4100: 'event' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 8 1 project-test
Warning 7 warning C4100: 'widget' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 8 1 project-test
Warning 8 warning C4100: 'data' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 15 1 project-test
Warning 9 warning C4100: 'event' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 15 1 project-test
Warning 10 warning C4100: 'widget' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 15 1 project-test
Warning 11 warning C4505: 'g_bit_nth_lsf' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gutils.h 267 1 project-test
Warning 12 warning C4505: 'g_bit_nth_msf' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gutils.h 269 1 project-test
Warning 13 warning C4505: 'g_bit_storage' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gutils.h 271 1 project-test
Warning 14 warning C4505: 'g_string_append_c_inline' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gstring.h 130 1 project-test
Warning 15 warning C4505: 'g_trash_stack_push' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gtrashstack.h 44 1 project-test
Warning 16 warning C4505: 'g_trash_stack_pop' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gtrashstack.h 46 1 project-test
Warning 17 warning C4505: 'g_trash_stack_peek' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gtrashstack.h 47 1 project-test
Warning 18 warning C4505: 'g_trash_stack_height' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gtrashstack.h 48 1 project-test
Error 19 error LNK2005: "long __cdecl abs(long)" (?abs@@YAJJ@Z) already defined in FitsFile.obj C:\Users\Ian\SkyDrive\Documents\Uni\FINPRO\projects\project-test\project-test\main.obj project-test
Error 20 error LNK2005: "__int64 __cdecl abs(__int64)" (?abs@@YA_J_J@Z) already defined in FitsFile.obj C:\Users\Ian\SkyDrive\Documents\Uni\FINPRO\projects\project-test\project-test\main.obj project-test
Error 21 error LNK2005: "struct _ldiv_t __cdecl div(long,long)" (?div@@YA?AU_ldiv_t@@JJ@Z) already defined in FitsFile.obj C:\Users\Ian\SkyDrive\Documents\Uni\FINPRO\projects\project-test\project-test\main.obj project-test
Error 22 error LNK2005: "struct _lldiv_t __cdecl div(__int64,__int64)" (?div@@YA?AU_lldiv_t@@_J0@Z) already defined in FitsFile.obj C:\Users\Ian\SkyDrive\Documents\Uni\FINPRO\projects\project-test\project-test\main.obj project-test
Error 23 error LNK2005: _getwchar already defined in FitsFile.obj C:\Users\Ian\SkyDrive\Documents\Uni\FINPRO\projects\project-test\project-test\main.obj project-test
Error 24 error LNK2005: _putwchar already defined in FitsFile.obj C:\Users\Ian\SkyDrive\Documents\Uni\FINPRO\projects\project-test\project-test\main.obj project-test
Error 25 error LNK1169: one or more multiply defined symbols found C:\Users\Ian\SkyDrive\Documents\Uni\FINPRO\projects\project-test\Debug\project-test.exe project-test
Output for building on Warning Level 4 (when only including for one place)
Warning 1 warning C4273: 'getwchar' : inconsistent dll linkage c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h 615 1 project-test
Warning 2 warning C4273: 'putwchar' : inconsistent dll linkage c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h 617 1 project-test
Warning 3 warning C4100: 'data' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 8 1 project-test
Warning 4 warning C4100: 'event' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 8 1 project-test
Warning 5 warning C4100: 'widget' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 8 1 project-test
Warning 6 warning C4100: 'data' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 15 1 project-test
Warning 7 warning C4100: 'event' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 15 1 project-test
Warning 8 warning C4100: 'widget' : unreferenced formal parameter c:\users\ian\skydrive\documents\uni\finpro\projects\project-test\project-test\main.cpp 15 1 project-test
Warning 9 warning C4505: 'g_bit_nth_lsf' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gutils.h 267 1 project-test
Warning 10 warning C4505: 'g_bit_nth_msf' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gutils.h 269 1 project-test
Warning 11 warning C4505: 'g_bit_storage' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gutils.h 271 1 project-test
Warning 12 warning C4505: 'g_string_append_c_inline' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gstring.h 130 1 project-test
Warning 13 warning C4505: 'g_trash_stack_push' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gtrashstack.h 44 1 project-test
Warning 14 warning C4505: 'g_trash_stack_pop' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gtrashstack.h 46 1 project-test
Warning 15 warning C4505: 'g_trash_stack_peek' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gtrashstack.h 47 1 project-test
Warning 16 warning C4505: 'g_trash_stack_height' : unreferenced local function has been removed c:\users\ian\skydrive\documents\uni\finpro\gtk\include\glib-2.0\glib\gtrashstack.h 48 1 project-test
最佳答案
抽象出间接层背后的 C 功能:
原始结构(如果我理解正确的话,这就是你现在的结构):
file1.h -> #include included_c_api.h
file2.h -> #include included_c_api.h CAUSES errors.
新结构:
new_c_api.h -> wrapper over included_c_api.h functionality (w/ your own symbols)
new_c_api.c[pp] -> #include included_c_api.h
file1.h -> #include new_c_api.h
file2.h -> #include new_c_api.h
如果 included_c_api.h 中公开的功能非常大,则此解决方案可能不切实际。
关于c++ - 如何仅包含一次文件/防止 C++ 程序中旧 C API 中的函数重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20221598/