Windows平台使用cmake 链接动态库
与Unix likes 平台不同 Windows平台上使用cmake 链接动态库有一些特别之处:
Windows平台 cmake构建动态库
《1》.即便使用cmake 构建动态库;在Windows平台下导出动态库的函数需要符合Windows编译器规范;否则即便cmake能正常构建动态库;动态库中也是无导出函数或者找不到导出函数的函数体【unix likes 平台 可能没有这方面的要求,因为.so文件中的函数默认都是导出的】
《2》.链接动态库与动态库的导入库
1.同一个cmake项目 构建的动态库,被同一个cmake项目的目标程序链接;只需要指定链接动态库时需要搜索目录和链接的目标名称即可【甚至这种情况只需要指定链接目标即可】
link_directories(E:\\TS练习代码\\cmakeTest\\temp\\bin)
target_link_libraries(new hello)
2.如果链接已经的动态库,即外界生成的动态库
#mylib 是链接的目标名称不必与实际链接的文件名称一致
add_library(mylib SHARED IMPORTED)
set_target_properties(mylib PROPERTIES
IMPORTED_LOCATION "E:\\TS练习代码\\cmakeTest\\temp\\bin\\hello.dll"
IMPORTED_IMPLIB "E:\\TS练习代码\\cmakeTest\\temp\\lib\\hello.lib"
)
【Windows平台 链接动态库时,实际链接的是动态库的导入库;然后再运行时由动态库的导入库去找真正的函数体;动态库的导入库相当于一个中间层】
对比:
Unix likes 系统下 链接动态库分二种情况
1.同一个cmake项目 构建的动态库,被同一个cmake项目的目标程序链接;只需要指定链接动态库时需要搜索目录和链接的目标名称即可【甚至这种情况只需要指定链接目标即可】
link_directories(E:\\TS练习代码\\cmakeTest\\temp\\bin)
target_link_libraries(new hello)
2.链接已有的动态库,即链接外界生成的动态库
find_path(MYLIB_INCLUDE_DIR MyLib.h PATHS /path/to/include REQUIRED)
# 查找第三方库的动态库文件【查找外界已有的动态库作为目标,再链接目标】
find_library(MYLIB_LIBRARY MyLib PATHS /path/to/lib REQUIRED)
# 添加可执行文件
add_executable(MyApp src/main.cpp)
# 包含第三方库的头文件目录
target_include_directories(MyApp PRIVATE ${MYLIB_INCLUDE_DIR})
# 链接第三方库
target_link_libraries(MyApp PRIVATE ${MYLIB_LIBRARY})
Unix likes 平台 查找的是动态库本身的路径
Unix likes平台链接动态库时,链接的就是动态库本身
《3》.执行时动态库文件,依然需要放在执行程序所在的目录中