有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文件中调用它的函数?
答案 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()