C++ 混合C和C时重复符号++;

C++ 混合C和C时重复符号++;,c++,c,cmake,linker-errors,sdl-2,C++,C,Cmake,Linker Errors,Sdl 2,我试图通过(第4页)学习如何使用项目/工具包/库。然而,每当我链接它时,它就会失败,并引用重复的符号错误。repo中提供的这两种方法可以很好地构建、编译和工作 我的假设是,因为我试图把示例代码从手册写入C++文件,而库是纯C89,所以内部有一些愤怒的编译器爆炸。如果我用相同的代码向前声明一个C函数,一切似乎都是好的,但是我真的不想有一组C++文件,它们纯粹是作为委托来调用C函数。 它在项目中(在第一段末尾)说,所有东西都是C++兼容的,实际上是用SDL2库写的方式编写的,我可以不用问题就使用它。

我试图通过(第4页)学习如何使用项目/工具包/库。然而,每当我链接它时,它就会失败,并引用重复的符号错误。repo中提供的这两种方法可以很好地构建、编译和工作

我的假设是,因为我试图把示例代码从手册写入C++文件,而库是纯C89,所以内部有一些愤怒的编译器爆炸。如果我用相同的代码向前声明一个C函数,一切似乎都是好的,但是我真的不想有一组C++文件,它们纯粹是作为委托来调用C函数。

它在项目中(在第一段末尾)说,所有东西都是C++兼容的,实际上是用SDL2库写的方式编写的,我可以不用问题就使用它。SDL2吻头似乎是正确设置与C++一起使用,使用:

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
};
#endif
<> P>尽可能地导致建筑代码“x8664”<代码>链接器错误走,我有三个疑点:我对C与C++混合的无知,我为项目写的CMAKELIST,或者库本身的问题(我认为这是难以置信的)。几天来,我一直在处理各种可能的解决方案,但没有遇到比“向前声明”更好的解决方案(同样,我也不想这样做)。下面,您将找到确切的错误,我的
main.cpp
文件,它只包含手册中的代码,以及我编写的
CMakeLists
文件。发布的代码不是为我构建的,但我可以发布工作C++文件,它向前声明C函数,如果这有帮助的话。 从终端出错 main.cpp 克马克主义者 如果我能提供更多的信息来帮助,请让我知道

谢谢

实际上定义了许多变量:

double kiss_spacing;
int kiss_textfont_size, kiss_buttonfont_size;
int kiss_click_interval, kiss_progress_interval;
int kiss_slider_padding;
int kiss_border, kiss_edge;
int kiss_screen_width, kiss_screen_height;
这些变量在包含该文件的每个C/C++文件中定义。因此,您会得到重复的符号-因为存在重复的符号

修复?修复代码,使其正确运行

换句话说,代码被破坏了。

实际上定义了许多变量:

double kiss_spacing;
int kiss_textfont_size, kiss_buttonfont_size;
int kiss_click_interval, kiss_progress_interval;
int kiss_slider_padding;
int kiss_border, kiss_edge;
int kiss_screen_width, kiss_screen_height;
这些变量在包含该文件的每个C/C++文件中定义。因此,您会得到重复的符号-因为存在重复的符号

修复?修复代码,使其正确运行

换言之,代码已被破坏。

现在已修复。外部“C”虽然意味着它下面的声明就像C++,其余代码像C一样编译,就像我的C89。如果是用C编译器编译的,文件扩展名为C。正确理解这一点是解决问题的关键

SDL2的简单通用GUI小部件工具包,由我编写。

现在已经修复。外部“C”虽然意味着它下面的声明就像C++,其余代码像C一样编译,就像我的C89。如果是用C编译器编译的,文件扩展名为C。正确理解这一点是解决问题的关键


SDL2的简单通用GUI小部件工具包,由我编写。

谢谢您的回答!我会更深入地研究这个问题,但我应该向图书馆的创建者汇报,还是我做错了什么?另外,应该修复哪些代码、头文件还是其他文件?@MichaelBethke-用于包含在使用库的多个文件中的头文件不应该定义这样的变量。如果不深入研究库代码及其文档,我真的不能说如何最好地修复它——这只是我的观点。如果您按照文档中的说明使用它,那么让它工作的唯一方法就是使用链接时间选项来接受重复符号,或者以这样的方式更改代码,将头文件仅包含在一个源文件中。好的,谢谢您的输入!我将与库创建者联系,看看他们如何评论标题的定义。非常感谢。谢谢你的回答!我会更深入地研究这个问题,但我应该向图书馆的创建者汇报,还是我做错了什么?另外,应该修复哪些代码、头文件还是其他文件?@MichaelBethke-用于包含在使用库的多个文件中的头文件不应该定义这样的变量。如果不深入研究库代码及其文档,我真的不能说如何最好地修复它——这只是我的观点。如果您按照文档中的说明使用它,那么让它工作的唯一方法就是使用链接时间选项来接受重复符号,或者以这样的方式更改代码,将头文件仅包含在一个源文件中。好的,谢谢您的输入!我将与库创建者联系,看看他们如何评论标题的定义。非常感谢。
cmake_minimum_required(VERSION 3.3)
project(Test_KISS)


set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${Test_KISS_SOURCE_DIR}/cmake")
set(BIN_DIR ${Test_KISS_SOURCE_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)


#Define Preprocessor Macros (RESDIR found in include/kiss_sdl.h)
add_definitions(-DRESDIR=\"../../resources/\")


find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIR})

find_package(SDL2_ttf REQUIRED)
include_directories(${SDL2_TTF_INCLUDE_DIR})

find_package(SDL2_image REQUIRED)
include_directories(${SDL2_IMAGE_INCLUDE_DIR})

include_directories(include)


add_executable(Test_KISS src/main.cpp include/kiss_draw.c include/kiss_general.c include/kiss_posix.c include/kiss_widgets.c)


target_link_libraries(Test_KISS ${SDL2_LIBRARY} ${SDL2_TTF_LIBRARY} ${SDL2_IMAGE_LIBRARY})
install(TARGETS Test_KISS RUNTIME DESTINATION ${BIN_DIR})
double kiss_spacing;
int kiss_textfont_size, kiss_buttonfont_size;
int kiss_click_interval, kiss_progress_interval;
int kiss_slider_padding;
int kiss_border, kiss_edge;
int kiss_screen_width, kiss_screen_height;