加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows上的cmake链接共享库

发布时间:2020-12-14 04:18:25 所属栏目:Windows 来源:网络整理
导读:有3个文件[m.c,m.h,main.c]. 莫氏硬度 // m.hint 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),但我已经制作了CMakeList
有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 "Debugm.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++)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读