2011-01-24 16 views
0

こんにちは基本的に私はhereからsvmを使用しようとしています。これは、Cで書かれており、C++でそれを使用する方法を説明しますされています
CコードとしてCMAKEリンク外部Cライブラリ

  • コンパイル "svm_learn.c"、 "svm_common.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が発生します。 私はこれらの.hファイルが.oファイルのフロントエンドであることをcmakeに伝えなければならないと思っています。しかしどうですか?

答えて

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

感謝 –