Windows上的cmake链接共享库

有3个文件[ mcmhmain.c ]。

MH

// mh int m(); 

MC

 // mc #include <stdio.h> #include "mh" int m(){ printf("Hello,m!\n"); return 0; } 

main.c中

 // main.c #include "mh" int main(){ return m(); } 

虽然我更喜欢共享库(m.dll),但我做了CMakeLists.txt

  PROJECT("app1") ADD_LIBRARY(m SHARED mc) ADD_EXECUTABLE(myexe main.c) TARGET_LINK_LIBRARIES(myexe m) 

CMakeconfiguration完成并生成完成。 打开app1.sln并使用Visual Studio构build,崩溃为LNK1104:无法打开文件“Debug \ m.lib” 。 它只能作为STATICADD_LIBRARY() 。可以解释为什么它不能在Windows上工作?

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

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

  • 在不同的操作系统上使用不同的编译器创建和使用共享库

总之,您需要为mh声明的任何内容定义一些“导出前缀”。 否则,构建过程不会为静态链接命名的m.lib生成一个“导入库”(另请参阅CMAKE_IMPORT_LIBRARY_SUFFIX )。

这里是你需要修改的代码:

MH

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

MC

 #include "mh" #include <stdio.h> int m(){ printf("Hello,m!\n"); return 0; } 

的CMakeLists.txt

 cmake_minimum_required(VERSION 3.0) include(GenerateExportHeader) PROJECT("app1") INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}") ADD_LIBRARY(m SHARED mc mh m_exports.h) GENERATE_EXPORT_HEADER(m BASE_NAME m EXPORT_MACRO_NAME M_EXPORTS EXPORT_FILE_NAME m_exports.h STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC) ADD_EXECUTABLE(myexe main.c) TARGET_LINK_LIBRARIES(myexe m) 

其他参考

  • GenerateExportHeader宏
  • cmake和GenerateExportHeader
  • 我如何得到CMake创建一个DLL和它的匹配的lib文件?
  • MSDN: 演练:创建和使用动态链接库(C ++)

使用WINDOWS_EXPORT_ALL_SYMBOLS可能会有帮助。 详情请参阅介绍性文章 。 总之,像这样调用CMake:

 cmake -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE