使用C而不是C++; 我有一个C++项目,我使用CMASE配置了使用Eclipse。我的问题是,我添加了一个静态C库(即SVM结构/SVM光),它似乎不编译-我猜想是编译为C++而不是C.

使用C而不是C++; 我有一个C++项目,我使用CMASE配置了使用Eclipse。我的问题是,我添加了一个静态C库(即SVM结构/SVM光),它似乎不编译-我猜想是编译为C++而不是C.,c++,c,eclipse,cmake,C++,C,Eclipse,Cmake,我将库添加到我的项目中,如下所示: SET(SVM_LIGHT_SRC_DIR "../../Libraries/svm_rank") INCLUDE_DIRECTORIES(${SVM_LIGHT_SRC_DIR}) ADD_LIBRARY( svm_rank_lib STATIC ${SVM_LIGHT_SRC_DIR}/svm_light/svm_learn.c ${SVM_LIGHT_SRC_DIR}/svm_light/svm_common.c ${S

我将库添加到我的项目中,如下所示:

SET(SVM_LIGHT_SRC_DIR "../../Libraries/svm_rank")
INCLUDE_DIRECTORIES(${SVM_LIGHT_SRC_DIR})

ADD_LIBRARY(
    svm_rank_lib STATIC
    ${SVM_LIGHT_SRC_DIR}/svm_light/svm_learn.c
    ${SVM_LIGHT_SRC_DIR}/svm_light/svm_common.c
    ${SVM_LIGHT_SRC_DIR}/svm_light/svm_hideo.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct/svm_struct_learn.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct/svm_struct_common.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct/svm_struct_classify.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct_api.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct_learn_custom.c
)

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} svm_rank_lib)
#ifdef __cplusplus
extern "C" {
# include "svm_struct/svm_struct_common.h"
}
#endif
Cmake的配置似乎很好。在配置的输出中,它指定它找到了C和C++编译器,并且它们“工作”。我使用extern将标题添加到我的一个项目文件中,如下所示:

SET(SVM_LIGHT_SRC_DIR "../../Libraries/svm_rank")
INCLUDE_DIRECTORIES(${SVM_LIGHT_SRC_DIR})

ADD_LIBRARY(
    svm_rank_lib STATIC
    ${SVM_LIGHT_SRC_DIR}/svm_light/svm_learn.c
    ${SVM_LIGHT_SRC_DIR}/svm_light/svm_common.c
    ${SVM_LIGHT_SRC_DIR}/svm_light/svm_hideo.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct/svm_struct_learn.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct/svm_struct_common.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct/svm_struct_classify.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct_api.c
    ${SVM_LIGHT_SRC_DIR}/svm_struct_learn_custom.c
)

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} svm_rank_lib)
#ifdef __cplusplus
extern "C" {
# include "svm_struct/svm_struct_common.h"
}
#endif
当我开始构建项目时,错误如下:

../../Libraries/svm_rank/svm_struct/../svm_struct_api_types.h:75:11: error: expected member name or ';' after declaration specifiers
  double *class;    /* vector of scores that imply ranking */
  ~~~~~~  ^
1 error generated.

在库头中有一个变量,称为“类”,其中发生错误,我猜想是试图用C++来编译这个库头,而不是C. First,这是错误的原因吗?如果是这样,我应该如何着手解决这个问题

double *class;    /* vector of scores that imply ranking */
如果有帮助,则以蓝色突出显示。是保留字,表示不能将其用作变量或宏名称。尝试更改它,它将删除错误

编辑
我误解了你在C中编译,但它似乎是用C++编译的。但是我仍然坚持我的答案,最好是改变变量类,以保持代码与C++的一致性,因为类是C++中的保留字。

已经指出,问题的根源是C库头声明了一个变量:<代码>类< /C> >,这是C++中的关键字。 <>这个问题会被你的头被一个C++源文件拉入。请记住,头文件不是自己编译的,而只是由预处理器复制粘贴到源文件中,该源文件包含头文件。它是源文件的类型,它确定标题中的代码是否被解释为C或C++。 您将include包装在
extern“C”
中的事实并没有改变这一点。它只是用于标题中的声明,但是代码仍然需要编译为有效的C++。 这个问题最干净的解决方案是一种称为隔离或编译器防火墙的技术

您必须确保与问题库接触的所有部分都是C源文件本身。代码的C++部分只通过C部分的接口与库交互,但不能直接与库一起使用。特别是,决不能从任何头文件中包含库头文件

例如:
my_interface.c

#include "svm_struct/svm_struct_common.h"  /* safe to include from a .c file */

struct opaque_ {
     /* you can use types from svm_struct_common in here */
};

opaque* initialize()
{
     /* you can create an opaque_ on the heap and
        manipulate it here, as well as give a
        pointer back to the C++ part */
}

void do_stuff(opaque*)
{
    /* do whatever you like with the stuff in opaque */
}
my_interface.h

/* no #includes in the header! */

/* the opaque type is only forward declared!
   C++ code can obtain a pointer to it,
   but cannot look inside */
struct opaque_;
typedef struct opaque_ opaque;

opaque* initialize();
void do_stuff(opaque*);
my_application.cpp

// we only include our own header, which we made sure is valid C++
extern "C" {
    #include <my_interface.h>
}

void do_stuff()
{
    opaque* context = initialize();
    do_stuff(context);
}
<代码> //我们只包含自己的头,我们确信它是有效的C++。 外部“C”{ #包括 } void do_stuff() { 不透明*上下文=初始化(); 做一些事情(上下文); }
类是保留类word@cssGEEK准确地说:<代码>类<代码>是一个保留关键字。如果你使用的是<代码> GCC ,你可以通过使用<代码> -WC++COMPATA//Cuff>标记来指出C代码中的潜在问题。是的,我理解C++中的一个保留关键字,但是头文件是C,这是我理解的地方。“class”不是一个保留关键字。我知道我可以修补库,但我想找到一个解决方案,而不必这样做。同样,这是头应该是在C中,我的理解是“class”“不是保留关键字。因此,我猜想它是编译为C++而不是C,然后显示你的make文件。如果eclipse必须有一些选项来从g++更改为gcc。我不使用eclipse,因此我无法提供帮助。使用一个保留词的变量名可能是不好的做法,在C.,这可能不是为了让代码与C++兼容,我忘了感谢你的答案,结果非常有帮助: