有3个文件[ mc , mh , main.c ]。
MH
// mh int m();
MC
// mc #include <stdio.h> #include "mh" int m(){ printf("Hello,m!\n"); return 0; }
main.c中
// main.c #include "mh" int main(){ return m(); }
虽然我更喜欢共享库(m.dll),但我做了CMakeLists.txt
PROJECT("app1") ADD_LIBRARY(m SHARED mc) ADD_EXECUTABLE(myexe main.c) TARGET_LINK_LIBRARIES(myexe m)
CMakeconfiguration完成并生成完成。 打开app1.sln并使用Visual Studio构build,崩溃为LNK1104:无法打开文件“Debug \ m.lib” 。 它只能作为STATIC在ADD_LIBRARY()
。可以解释为什么它不能在Windows上工作?
如果我有另一个共享库(mylib.dll),我怎么能在我的main.c和CMakeLists.txt文件中调用它的函数?
不同平台上的动态库链接之间也存在差异,这也需要一些额外的代码。 好消息是,CMake可以帮助你。 我发现Gernot Klingler的以下博客文章非常有用:
总之,您需要为mh
声明的任何内容定义一些“导出前缀”。 否则,构建过程不会为静态链接命名的m.lib
生成一个“导入库”(另请参阅CMAKE_IMPORT_LIBRARY_SUFFIX
)。
这里是你需要修改的代码:
MH
#include "m_exports.h" int M_EXPORTS m();
MC
#include "mh" #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 mc mh 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)
其他参考
使用WINDOWS_EXPORT_ALL_SYMBOLS可能会有帮助。 详情请参阅介绍性文章 。 总之,像这样调用CMake:
cmake -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE