【问题标题】:Link .a file with CMake, using VS 2013 compiler使用 VS 2013 编译器将 .a 文件与 CMake 链接
【发布时间】:2019-02-10 03:35:34
【问题描述】:

我有以下文件树:

   C:.
    │   CMakeLists.txt
    │   myLibraryHeader.h
    │   test.c
    │
    └───myLib
        ├───win32
        │       myLibrary.a
        │
        └───win64
                myLibrary.a

以及以下 CMake 文件:

cmake_minimum_required(VERSION 2.8)
project(myProject)
link_directories(myLib/win32) 
add_executable(main test.c)
target_link_libraries(main myLib/win32/myLibrary.a)

myLibraryHeader.h 是标头,而实现在 .a 文件中。 test.c 使用在 myLibraryHeader.h 中声明的函数。

但是,当我尝试使用 VS2013 编译器对其进行编译时,我收到此错误:

Error   1   error LNK1104: cannot open file 'myLibrary.lib'

VS寻找.lib文件而不是.a文件的原因是什么?

如何解决?

【问题讨论】:

  • 根据doc,我相信您要么需要完整路径,要么只需要库名称。能否将库路径修改为${CMAKE_CURRENT_SOURCE_DIR}/myLib/win32/myLibrary.a?那是怎么做的?
  • 静态库myLibrary.a 不是“win32”库。该库适用于 Linux,因为它具有 .a 扩展名。 MinGW 编译器/链接器也可以使用该库。但是在 Windows 上,静态库应该具有 .lib 扩展名(因此,它们应该由适当的编译器构建)。这就是VS2013寻找.lib文件的原因。
  • @Tsyvarev,鉴于库只有 C 内容(公共)a 库应该由 MSVC 使用而没有任何问题。
  • @ixSci:MSVC 第一次可以与.a 库一起使用。 MSVC 库的格式不应该与.a 不同吗?
  • @Tsyvarev,它们必须兼容才能支持 C 接口。我不能说格式的差异,但MSVC别无选择,只能支持它。

标签: c cmake linker .a


【解决方案1】:

尝试以下方法:

unset(CMAKE_LINK_LIBRARY_SUFFIX)

但请注意,它会影响从这一行开始传递给target_link_libraries 的任何库名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多