windows - Windows 上的 CMake 链接共享库

标签 windows build cmake

共有三个文件,(m.cm.h 和 **main.c*)。

文件m.h

// 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 的以下博客文章非常有用:

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

这是您的代码,需要进行修改:

m.h

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

其他引用资料

关于windows - Windows 上的 CMake 链接共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33062728/

相关文章:

c - 为什么许多窗口的窗口创建速度很慢?可以更快吗?

maven - 使用(maven)存储库和 Maven/Gradle 管理多个项目的最佳实践?

windows - CMake 错误 - 无法检测 libjpeg 和 ADD_SUBDIRECTORY() 错误

cmake - 调试cmake,变量在哪里定义?

c - 无法使用生成的 NDK 工具链构建 C 代码

c++ - 错误 124 - SHFileOperation 的系统调用级别不正确

windows - 奇怪的批处理文件编程错误 :Invalid argument/option: - 'eq'

python - 为什么仅在填充窗口时才会出现 "command not recognized"错误?

kotlin - 如何使用Gradle Kotlin DSL向所有 jar 添加前缀

android - Cocos2d-x 3.13.1 : error with cocos run (Android)