2011-01-24 152 views
0

嗨,基本上我试图从here使用svm。它是用C语言编写,并作出指示如何在C++中使用它:CMAKE链接外部c库

  • 编译 “svm_learn.c”, “svm_common.c”,并作为
    C代码 “svm_hideo.c”。
  • 要呼叫svm_learn/8和classify_example/2 (或classify_example_linear/2) 需要包括以下 头中的C++程序:

    的extern “C”{ #包括“svm_common。 H” #包括 “svm_learn.h” }

  • 链接 “svm_learn.o”, “svm_common.o” 和 “svm_hideo.o” 你的程序。

所以我编译提到的文件,并获得所需的.o文件。 比我说:

SET(svm_lib_light_obj 
    E:\framework\svm_light\build\svm_learn.o 
    E:\framework\svm_light\build\svm_common.o 
    E:\framework\svm_light\build\svm_hideo.o 
) 

ADD_LIBRARY(
    svm_lib_light 
    STATIC 
    EXCLUDE_FROM_ALL 
    ${svm_lib_light_obj} 
) 

SET_SOURCE_FILES_PROPERTIES(
    ${svm_lib_light_obj} 
    PROPERTIES 
    EXTERNAL_OBJECT true # to say that "this is actually an object file, so it should not be compiled, only linked" 
    GENERATED true  # to say that "it is OK that the obj-files do not exist before build time" 
) 

SET_TARGET_PROPERTIES(
    svm_lib_light 
    PROPERTIES 
    LINKER_LANGUAGE C# Or else we get an error message, because cmake can't figure out from the ".o"-suffix that it is a C-linker we need. 
    ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib 
) 

所以,现在我只需要包含提及的.h文件。我将他们添加到我的其他源文件:

ADD_EXECUTABLE (MYProgramm 
      ... 
      #other source files 
      ... 
      src/svm_common.h 
      src/svm_learn.h 
) 

不幸的是它不工作。从这些.h文件调用任何函数都会导致链接器错误LNK2001,LNK1120。 我猜我必须告诉cmake这些.h文件是.o文件的前端。但是如何?

回答

5

最好的办法是那些C文件添加到项目中:

SET(SVM_LIGHT_SRC_DIR "E:/framework/svm_light") 

INCLUDE_DIRECTORIES(${SVM_LIGHT_SRC_DIR}) 

ADD_LIBRARY(
    svm_lib_light 
    ${SVM_LIGHT_SRC_DIR}/svm_learn.c 
    ${SVM_LIGHT_SRC_DIR}/svm_common.c 
    ${SVM_LIGHT_SRC_DIR}/svm_hideo.c 
) 

ADD_EXECUTABLE (MYProgramm 
      ... 
      #other source files 
      ... 
) 

TARGET_LINK_LIBRARIES(MYProgram svm_lib_light) 
+0

感谢,帮助 – 2011-01-24 21:28:20