Warm tip: This article is reproduced from serverfault.com, please click

build-Windows上的CMake链接共享库

(build - CMake link shared library on Windows)

发布于 2015-10-11 07:50:24

一共有三个文件(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"

只能在上作为STATIC使用ADD_LIBRARY()为什么在Windows上不起作用?

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

Questioner
llorch
Viewed
12
2017-05-23 20:17:39

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

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

这是你的代码,其中包含所需的修改:

兆赫

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

其他参考