From 4428f078e71cf3ff35dd9a36b64a43bde630b590 Mon Sep 17 00:00:00 2001 From: Li Xinwei <1326710505@qq.com> Date: Thu, 27 May 2021 19:41:43 +0800 Subject: CMake: Fix generated prl and pri files for MSVC In MSVC static build, if we build Qt with 3rdparty library (e.g. zstd), cmake will add"zstd" (without "-l" prefix) to Qt6Core.prl. Then we use this Qt to build a qmake project, compilation will fail due to missing zstd.obj. Without "-l" prefix, qmake will treat "zstd" as an object file instead of a library. Library names in qt_module.pri and qt_lib_*_private.pri are also missing "-l" prefix. This is because on most compilers, CMAKE_LINK_LIBRARY_FLAG equals "-l". But on MSVC, it is an empty string. So we should pass "-DLINK_LIBRARY_FLAG=-l" for MSVC. Also add "-L/path/to/library" if the library path is not in default linker search directories. This will write un-relocatable paths to prl files only when using 3rdparty libraries to build Qt statically. Usually it's not a problem. In addition, CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES is also empty on MSVC. So The third argument of "$" is empty, it is an invalid generator expression. This means no include dir will be written to qt_module.pri and qt_lib_*_private.pri on MSVC. So only use "$" when CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES is not empty. Change-Id: Ib66f95dc09cf920363a4b9338fb97747dd2f8ab7 Reviewed-by: Qt CI Bot Reviewed-by: Alexandru Croitor (cherry picked from commit 2c49f85380d7ad79d9473e0f42e7afaa36d31af9) Reviewed-by: Qt Cherry-pick Bot --- cmake/QtGenerateLibHelpers.cmake | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'cmake/QtGenerateLibHelpers.cmake') diff --git a/cmake/QtGenerateLibHelpers.cmake b/cmake/QtGenerateLibHelpers.cmake index dedcdc7950..913b0ed90a 100644 --- a/cmake/QtGenerateLibHelpers.cmake +++ b/cmake/QtGenerateLibHelpers.cmake @@ -64,6 +64,12 @@ function(qt_transform_absolute_library_paths_to_link_flags out_var library_path_ foreach(library_path ${library_path_list}) qt_get_library_with_link_flag(lib_name_with_link_flag "${library_path}") if(lib_name_with_link_flag) + get_filename_component(dir "${library_path}" DIRECTORY) + # If library_path isn't in default link directories, we should add it to link flags. + list(FIND IMPLICIT_LINK_DIRECTORIES ${dir} index) + if(${index} EQUAL -1) + list(APPEND out_list "-L${dir} ") + endif() list(APPEND out_list "${lib_name_with_link_flag}") else() list(APPEND out_list "${library_path}") -- cgit v1.2.3