使用cmake-tools 在vscode 中編譯CMakeList項目

1、cmake documentation

https://cmake.org/cmake/help/latest/index.html

 

2、Creating and using shared libraries with different compilers on different operating systems

http://gernotklingler.com/blog/creating-using-shared-libraries-different-compilers-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

 

  1. 在使用cmake編譯工程注意的幾點問題
    1. 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_是提示這個函數是個樁代碼,程序跳轉)

 

    1. cmakeList文件中的定義是上下繼承的關係,導入導出符號:

需要在當前項目使用 #define SHARED_EXPORT __declspec(dllexport),

在別的引用項目聲明爲#define SHARED_EXPORT __declspec(dllimport)

不然同樣會提示函數未實現,無法找到

 

    1. 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

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

 

    1. 在Windows上 使用find_package(PkgConfig) 查找三方庫配置屬性:

安裝Windows版本的add pkg-config.exe to system  env path

PkgConfig 搜索的路徑是 CMAKE_PREFIX_PATH 並且設置ENV{PKG_CONFIG_PATH}

 

    1. Find_package 命令搜索的路徑是 CMAKE_MODULE_PATH

https://blog.csdn.net/harbor1981/article/details/73850653

 

    1. 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程序以來缺少的動態庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章