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 編譯根據不同編譯器函數導出宏不一樣,如下圖
對於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程序以來缺少的動態庫