微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/windows/364697.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐