有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?
不同平台上的动态库链接之间存在差异,这也需要一些额外的代码.好消息是,CMake可以帮助您解决这个问题.我在
Gernot Klingler发现以下博客文章非常有用:
> Creating and using shared libraries with different compilers on different operating systems
简而言之,您需要为m.h中声明的内容定义一些“导出前缀”.否则,构建过程将不会生成用于静态链接名为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)
其他参考文献
> GenerateExportHeader宏
> cmake and GenerateExportHeader
> How do I get CMake to create a dll and its matching lib file?
> MSDN:Walkthrough: Creating and Using a Dynamic Link Library (C++)