https://cmake.org/cmake/help/latest/index.html
http://gernotklingler.com/blog/creating-using-shared-libraries-different-compilers-different-operating-systems/
https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/
https://stackoverflow.com/questions/225432/export-all-symbols-when-creating-a-dll/731767
对于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_是提示这个函数是个桩代码,程序跳转)
需要在当前项目使用 #define SHARED_EXPORT __declspec(dllexport),
在别的引用项目声明为#define SHARED_EXPORT __declspec(dllimport)
不然同样会提示函数未实现,无法找到
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
https://docs.microsoft.com/zh-cn/cpp/build/reference/zc-inline-remove-unreferenced-comdat?view=vs-2019
vs编译参数在cmake中对照:
https://blog.csdn.net/JinhuCheng/article/details/84025207
安装Windows版本的add pkg-config.exe to system env path
PkgConfig 搜索的路径是 CMAKE_PREFIX_PATH 并且设置ENV{PKG_CONFIG_PATH}
https://blog.csdn.net/harbor1981/article/details/73850653
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程序以来缺少的动态库