Windows上的CMake链接共享库

地板

一共有三个文件(mcmh和** main.c *)。

档案mh

// m.h
int m();

文件mc

// 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"

只能在上用作STATICADD_LIBRARY()为什么在Windows上不起作用?

如果我有另一个共享库(mylib.dll),如何在main.c和CMakeLists.txt文件中调用其功能?

弗洛里安

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

简而言之,您需要为中声明的内容定义一些“导出前缀” m.h否则,构建过程将不会生成用于静态链接named的“导入库” m.lib(另请参见CMAKE_IMPORT_LIBRARY_SUFFIX)。

这是需要修改的代码:

h

#include "m_exports.h"

int M_EXPORTS m();

mc

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

其他参考

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

macOS 上使用 cmake 的共享库的链接器问题

如何在Windows中将共享库* dll与CMake链接

CMake,共享库链接失败

CMake:处理共享库与静态库的链接

麻烦使用CMake链接到Windows上的静态库

Windows上的CMake项目中的SFML库链接错误

链接共享 dll 库 cmake clion 项目

CMake:修改共享库时的冗余链接

[cmake]如何使用cmake在Windows上包含和链接系统库

在github上与cmake共享库版本控制

与CMake生成FlatBuffers Windows共享库

cmake:进入链接阶段时找不到共享库

具有版本信息的CMAKE链接共享库

CMake链接静态库反对共享的一个

编译共享库时传递的CMake链接目录

CMake:将openscenegraph链接到我的共享库

构建使用Cmake可执行和可链接的共享库

cmake:如何链接在Windows上具有lib前缀的库

C++ 共享库:在 Windows 上,客户端链接很好,但在 Linux (GCC) 上出现未定义的错误

在将共享库层次结构链接到可执行文件时,cmake链接错误

与共享库链接

链接特殊的共享库

共享库符号冲突和静态链接(在Linux上)

CMake:在 Windows 中拥有共享库:加载共享库时出错

无法使用Cmake在Android中将静态C库与共享库链接

Cmake链接共享库:当包含库中的头文件时,“没有这样的文件或目录”

如何使用cmake在Mac上链接OpenGL相关库?

cmake,无法运行与预编译共享库链接的可执行文件

仅当标题在CMake中更改时才重新链接共享库