2011-01-24 197 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