CMAKE ссылка внешняя библиотека c - PullRequest
0 голосов
/ 24 января 2011

Привет в основном я пытаюсь использовать SVM от здесь . Он написан на C и дает инструкции, как использовать его на C ++:

  • Скомпилируйте "svm_learn.c", "svm_common.c" и "svm_hideo.c" как
    С-код.
  • Программа на C ++, которую вы хотите вызвать svm_learn / 8 и classify_example / 2 (или classify_example_linear / 2) из необходимо включить следующее заголовки:

    extern "C" { # include "svm_common.h" # include "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. Но как?

1 Ответ

5 голосов
/ 24 января 2011

Лучшим способом было бы добавить эти файлы 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...