Windows上的cmake链接共享库

时间:2015-10-11 07:50:24

标签: windows build 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文件中调用它的函数?

3 个答案:

答案 0 :(得分:18)

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

简而言之,你需要一些&#34;导出前缀&#34;为m.h中声明的内容定义。否则,构建过程将不会生成&#34;导入库&#34;用于静态链接名为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)

其他参考资料

答案 1 :(得分:6)

使用WINDOWS_EXPORT_ALL_SYMBOLS可能有所帮助。有关详细信息,请参阅介绍性article。简而言之,像这样调用CMake:

cmake -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE

答案 2 :(得分:0)

CMakeLists.txt中添加它。

if(MSVC)
    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
    set(BUILD_SHARED_LIBS TRUE)
endif()