Windows上的cmake链接共享库

前端之家收集整理的这篇文章主要介绍了Windows上的cmake链接共享库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有3个文件[m.c,m.h,main.c].

莫氏硬度

  1. // m.h
  2. int m();

M.C

  1. // m.c
  2. #include <stdio.h>
  3. #include "m.h"
  4.  
  5. int m(){
  6. printf("Hello,m!\n");
  7. return 0;
  8. }

main.c中

  1. // main.c
  2. #include "m.h"
  3. int main(){
  4. return m();
  5. }

虽然我更喜欢共享库(m.dll),但我已经制作了CMakeLists.txt

  1. PROJECT("app1")
  2. ADD_LIBRARY(m SHARED m.c)
  3. ADD_EXECUTABLE(myexe main.c)
  4. TARGET_LINK_LIBRARIES(myexe m)

完成CMake配置并完成生成.打开app1.sln并使用Visual Studio构建,它崩溃了

  1. LNK1104:Can't open file "Debug\m.lib"

它仅在ADD_LIBRARY()中用作STATIC.为什么它不适用于Windows?

如果我有另一个共享库(mylib.dll),我怎么能在main.c和CMakeLists.txt文件调用它的函数

不同平台上的动态库链接之间存在差异,这也需要一些额外的代码.好消息是,CMake可以帮助您解决这个问题.我在 Gernot Klingler发现以下博客文章非常有用:

> Creating and using shared libraries with different compilers on different operating systems

简而言之,您需要为m.h中声明的内容定义一些“导出前缀”.否则,构建过程将不会生成用于静态链接名为m.lib的“导入库”(另请参阅CMAKE_IMPORT_LIBRARY_SUFFIX).

以下是您需要修改代码

莫氏硬度

  1. #include "m_exports.h"
  2.  
  3. int M_EXPORTS m();

M.C

  1. #include "m.h"
  2. #include <stdio.h>
  3.  
  4. int m(){
  5. printf("Hello,m!\n");
  6. return 0;
  7. }

的CMakeLists.txt

  1. cmake_minimum_required(VERSION 3.0)
  2.  
  3. include(GenerateExportHeader)
  4.  
  5. PROJECT("app1")
  6.  
  7. INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}")
  8. ADD_LIBRARY(m SHARED m.c m.h m_exports.h)
  9. GENERATE_EXPORT_HEADER(m
  10. BASE_NAME m
  11. EXPORT_MACRO_NAME M_EXPORTS
  12. EXPORT_FILE_NAME m_exports.h
  13. STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC)
  14.  
  15. ADD_EXECUTABLE(myexe main.c)
  16. TARGET_LINK_LIBRARIES(myexe m)

其他参考文献

> GenerateExportHeader
> cmake and GenerateExportHeader
> How do I get CMake to create a dll and its matching lib file?
> MSDN:Walkthrough: Creating and Using a Dynamic Link Library (C++)

猜你在找的Windows相关文章