一共有三个文件(mc,mh和** main.c *)。
// m.h
int m();
// m.c
#include <stdio.h>
#include "m.h"
int m(){
printf("Hello,m!\n");
return 0;
}
// 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文件中调用其功能?
在不同平台上的动态库链接之间存在差异,这也需要一些其他代码。好消息是,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)
其他参考
我非常感谢您。非常感谢。
很抱歉,我现在只能找到“接受”按钮。
CMAKE_IMPORT_LIBRARY_SUFFIX
帮助了。谢谢。@Florian这是否意味着
xxx_exports.h
如果我有多个共享库,则必须为每个库创建多个库。此外,在Windows上使用cmake的静态库又如何呢?