Windows上的cmake链接共享库

有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?

如果我有一个共享库(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).

以下是您需要修改代码

莫氏硬度

#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++)

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...