【问题标题】:CMAKE link external c libraryCMAKE链接外部c库
【发布时间】:2011-01-24 20:32:48
【问题描述】:

嗨,基本上我正在尝试使用来自 here 的 svm。它是用 C 语言编写的,并提供了如何在 c++ 中使用它的说明:

  • 将“svm_learn.c”、“svm_common.c”和“svm_hideo.c”编译为
    C 代码。
  • 你想调用svm_learn/8和classify_example/2的C++程序 (或分类示例线性/ 2)来自 需要包括以下内容 标题:

    外部“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 文件的前端。但是怎么做呢?

【问题讨论】:

    标签: c++ linker cmake


    【解决方案1】:

    最好的方法是将这些 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多