使用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程序以来缺少的动态库

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值