问题描述
CLion使用Cmake
进行项目代码管理和编译控制。
程序引用动态库,后编译出现错误
Process finished with exit code -1073741515 (0xC0000135)
项目目录如下:
CMakeLists.txt
文件内容如下:
cmake_minimum_required(VERSION 3.20)
project(gogmssl C)
set(CMAKE_C_STANDARD 99)
LINK_DIRECTORIES(lib)
include_directories(include)
add_executable(gogmssl main.c)
target_link_libraries(gogmssl cyggmssl-3.dll)
这里程序使用到了gmssl
动态库,编译正常通过并且生成了可执行文件,这个可以从build
目录中看到
解决问题
0xC0000135 是由于可执行程序没有找到动态链接库导致
动态链接库在编译时是不会打包进可执行程序中,它在编译后可执行程序中只会留下连接地址,在程序启动启动时根据符号连接找到动态连接库相关代码。
那么可执行文件到哪儿找动态连接库?
- 可执行文件所在路径
- 操作系统动态库指定目录,如Linux 位于
/lib
如何解决该错误?
- 复制该链接库到可执行文件的目录
以上面程序为例,只需要把lib/cyggmssl-3.dll
复制到build
目录再次运行就可以解决问题。
静态链接
该问题实质上是因为程序使用了链接库中的代码,但是运行时没有找到代码导致。
有没有什么办法编译后程序不需要而外提供动态链接库才能运行?
- 使用静态链接库编译
静态链接实际上是库代码的一个打包整合,因此在编译时候将会和程序源代码一起编译,编译后可执行程序中就不需要依赖库文件就可以运行,因为库的代码已经在可执行文件中。
如何实现?
将动态连接库换成静态链接库,静态链接库一般以.a
结尾,例如:
add_executable(gogmssl main.c)
target_link_libraries(gogmssl libgmssl.a)
编译运行
参考文献
[1]. CSDN . Ocean&&Star . clion:win10下调用C动态库 . 2021-01-08 . https://blog.csdn.net/zhizhengguan/article/details/112373002
[2]. 博客园 . 王彬彬 . cmake 添加头文件目录,链接动态、静态库 . 2016-06-29 . https://www.cnblogs.com/binbinjx/p/5626916.html
[3]. Segmentfault . 码农的荒岛求生 . 彻底理解链接器:三,库与可执行文件 . 2018-09-18 . https://segmentfault.com/a/1190000016433897