有3个文件[m.c,m.h,main.c].
莫氏硬度
// m.h int m();
M.C
// m.c #include <stdio.h> #include "m.h" int m(){ printf("Hello,m!\n"); return 0; }
main.c中
// main.c #include "m.h" int main(){ return m(); }
虽然我更喜欢共享库(m.dll),但我已经制作了CMakeLists.txt
PROJECT("app1") ADD_LIBRARY(m SHARED m.c) ADD_EXECUTABLE(myexe main.c) TARGET_LINK_LIBRARIES(myexe m)
完成CMake配置并完成生成.打开app1.sln并使用Visual Studio构建,它崩溃了
LNK1104:Can't open file "Debug\m.lib"
它仅在ADD_LIBRARY()中用作STATIC.为什么它不适用于Windows?
不同平台上的动态库链接之间存在差异,这也需要一些额外的代码.好消息是,CMake可以帮助您解决这个问题.我在
Gernot Klingler发现以下博客文章非常有用:
原文链接:https://www.f2er.com/windows/364697.html> Creating and using shared libraries with different compilers on different operating systems
简而言之,您需要为m.h中声明的内容定义一些“导出前缀”.否则,构建过程将不会生成用于静态链接名为m.lib的“导入库”(另请参阅CMAKE_IMPORT_LIBRARY_SUFFIX
).
莫氏硬度
#include "m_exports.h" int M_EXPORTS m();
M.C
#include "m.h" #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 m.c m.h 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 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++)