1、cmake documentation
https://cmake.org/cmake/help/latest/index.html
2、Creating and using shared libraries with different compilers on different operating systems
3、Create dlls on Windows without declspec() using new CMake export all feature
https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/
4、Export all symbols when creating a DLL [with .def]
https://stackoverflow.com/questions/225432/export-all-symbols-when-creating-a-dll/731767
- 在使用cmake编译工程注意的几点问题
- Cmake 编译根据不同编译器函数导出宏不一样,如下图
- Cmake 编译根据不同编译器函数导出宏不一样,如下图
对于gcc编译器默认是导出所有函数的,但是在Windows上的MSBuild编译的函数是不导出的,要通过添加__declspec来声明要导出的函数,所以对于生成的obj文件的函数描述符有所不同,如下:
_imp_?staticMetaObject@AddressTester@QSS@@2UQMetaObject(MSBuild)
NULL?staticMetaObject@AddressTester@QSS@@2UQMetaObject(gcc)
这里要注意的是
使用cl.exe编译文件在生成obj文件时候,如果函数不是当前项目可找到的函数描述符,也没有通过_imp_?来标记函数,则会提示LINK ERROR 2001错误,提示函数没有实现。
或者开启
Cmake -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE
来导出所有函数符号,通过.def文件来说明导出函数列表,这样就达到和gcc编译器默认导出所有函数符号一样的效果了,
(但是要注意的,以及使用了__declspec声明的头会在编译导出符号默认生成_imp_前缀,即二者不可混合使用
_imp_是提示这个函数是个桩代码,程序跳转)
-
- cmakeList文件中的定义是上下继承的关系,导入导出符号:
需要在当前项目使用 #define SHARED_EXPORT __declspec(dllexport),
在别的引用项目声明为#define SHARED_EXPORT __declspec(dllimport)
不然同样会提示函数未实现,无法找到
-
- Cmake 设置编译链接参数宏:
set(CMAKE_CXX_FLAGS "/Zc:wchar_t /Zi /Gm- /Od /Zc:inline /WX- /Zc:forScope /Gd /Oy- /MDd /FC ${CMAKE_CXX_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "/Wl ${CMAKE_SHARED_LINKER_FLAGS}")
Vs编译参数说明:zc-inline
vs编译参数在cmake中对照:
https://blog.csdn.net/JinhuCheng/article/details/84025207
-
- 在Windows上 使用find_package(PkgConfig) 查找三方库配置属性:
安装Windows版本的add pkg-config.exe to system env path
PkgConfig 搜索的路径是 CMAKE_PREFIX_PATH 并且设置ENV{PKG_CONFIG_PATH}
-
- Find_package 命令搜索的路径是 CMAKE_MODULE_PATH
https://blog.csdn.net/harbor1981/article/details/73850653
-
- Qt compilation exited with code -1073741515
This exit code should be interpreted as an unsigned 32-Bit value. Then you get -1073741515 ⇒ 0xC0000135, which is the "NT status code":http://www.tenox.net/links/ntstatus.htmlfor STATUS_DLL_NOT_FOUND. It means Windows could not start the program, because a required DLL file is missing.
可以使用windeployqt.exe 部署当前qt程序以来缺少的动态库