c++ - CMAKE 链接外部 c 库

标签 c++ linker cmake

您好,基本上我正在尝试使用来自 here 的 svm .它是用 C 编写的,并给出了如何在 C++ 中使用它的说明:

  • Compile "svm_learn.c", "svm_common.c", and "svm_hideo.c" as
    C code.
  • The C++ program you want to call svm_learn/8 and classify_example/2 (or classify_example_linear/2) from needs to include the following headers:

    extern "C" { # include "svm_common.h" # include "svm_learn.h" }

  • Link "svm_learn.o", "svm_common.o", and "svm_hideo.o" to your program.

所以我编译了上述文件并获得了所需的 .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 文件添加到您的项目中:

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)

关于c++ - CMAKE 链接外部 c 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4786861/

相关文章:

c++ - SDL 运行时二进制文件,它们有什么用?

c++ - 设置子模块目标的输出目录时 CMAKE_BINARY_DIR 和 PROJECT_BINARY_DIR 之间的权衡

cmake - 移动目录后编辑与删除 CMakeCache.txt

Python导入模块函数

c++ - move 语义和原始类型

c++ - 如何按标题自动对方法进行排序?

c - C编译涉及哪些内部过程?

c - 将多个 C 库链接到 C 创建可执行文件

c++ - 使用新运算符 c++ 的静态绑定(bind)

cmake - 使用 CMake 下载预构建的库