【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、if

本文给出了 cmake 中的 一些常用的 指令,可以快速了解,为后面的内容深入 打点基础。

本专栏的详细实践代码全部放在 github 上,欢迎 star !!!

如有问题,欢迎留言、或加群【392784757】交流

注释

# 行注释

#[[
多行注释
]]

message(" " #[[这里也可以注释]] "")

message

在学习时 可以多用message() 来输出 想要查看的变量

message([<mode>] "message text" ...)

一般使用
message(“msg1” “msg2” “msg3”)

进阶使用-指定日志级别
message([] "message … ")
–log-level

标准输出 stdout
错误输出 stderr

日志级别

  1. FATAL_ERROR 停止cmake运行和生成 printed to stderr
  2. SEND_ERROR cmake继续运行,生成跳过 printed to stderr
  3. WARNING printed to stderr
  4. none printed to stderr
  5. STATUS 项目用户可能感兴趣的信息 stdout
  6. VERBOSE 针对项目用户的详细信息 stdout
  7. DEBUG 项目本身的开发人员使用的信息
  8. TRACE 非常低级实现细节的细粒度消息

set

set 主要是涉及变量的创建、和修改
cmake 变量,包括两个部分,内置变量、自定义变量

内置变量 可进一步细分

  • 信息变量 project_name
  • 行为变量 BUILD_SHARED_LIBS
  • 描述系统的变量 MSVC、WIN32、CMAKE_SYSTEM_NAME
  • 控制构建的变量

自定义变量,常为了更好控制 CMakeLists.txt 结构 ,逻辑流程,来定义一些变量,更好地辅助我们编写

如,

set(package_dir "") # 安装后的位置

set(package_root "") # 源码的位置

unset() 取消定义的变量

file

cmake fille 命令页面 :https://cmake.org/cmake/help/latest/command/file.html#file

在这里插入图片描述
常用的file 可分为是三个方面【其他的还有 Locking、 Path Conversion、Transfer、 archiving】

  • reading
  • writing
  • filesystem

下面给出了一些常用的 file 指令

  1. 创建与删除 文件/文件夹
file(MAKE_DIRECTORY files)
file(TOUCH files/4.txt)
file(TOUCH files/5.txt)

file(REMOVE 1.txt)
file(REMOVE_RECURSE files/4.txt)
  1. 创建写入\追加 文件
file(WRITE main.cpp [=[

#include<iostream>
using namespace std;
int main()
{
cout<<"hello file create"<<endl;
return 0;
}

]=])

file(WRITE output.txt "hello cmake,1,你好 cmake\n")
file(APPEND output.txt "this is additional content.")
  1. file 检索文件保存到 list ,然后进行遍历
file(GLOB_RECURSE all_files *.txt)

math(EXPR cnt "0")
foreach(file ${all_files})
  message("file_${cnt}: ${file}")
  math(EXPR cnt "${cnt}+1")
endforeach(file ${all_files})
  1. file 拷贝文件、安装文件等
file(COPY_FILE 2.txt 2_copy.txt)
file(COPY 2.txt DESTINATION files/2.txt)

file(INSTALL 2.txt DESTINATION ${CMAKE_PREFIX_PATH}/)

github上给出了更多详细的实践教程

foreach

cmake 中的 for 循环,相关指令签名如下

foreach(<loop_var> <items>)
  <commands>
endforeach()
# 
foreach(<loop_var> RANGE <stop>)

foreach(<loop_var> RANGE <start> <stop> [<step>])

foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])

主要是用来遍历 list ,

下面的CMakeLists.txt 给出了相关例子

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(foreach_argument LANGUAGES CXX)

list(APPEND files a.cpp b.cpp)

math(EXPR cnt "0")
foreach(file ${files})
  # message(STATUS "file_${cnt} ${file}")
  math(EXPR cnt "${cnt}+1")
endforeach()

foreach(i RANGE 10)
  # message(STATUS "${i}")
endforeach(i RANGE 10)

foreach(i RANGE 0 10 2)
  message(STATUS "${i}")
endforeach(i RANGE 10)

if

if()

elseif()

else()

endif()
### ---[ PCL global CMake cmake_minimum_required(VERSION 2.8 FATAL_ERROR) set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "possible configurations" FORCE) if("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "build type default to RelWithDebInfo, set to Release to improve performance" FORCE) endif("${CMAKE_BUILD_TYPE}" STREQUAL "") project(PCL) string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/" ${CMAKE_MODULE_PATH}) if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") add_definitions("-DBOOST_DISABLE_ASSERTS -DEIGEN_NO_DEBUG") endif() if(WIN32) if(NOT DEFINED CMAKE_DEBUG_POSTFIX) set(CMAKE_DEBUG_POSTFIX "_debug") endif() if(NOT DEFINED CMAKE_RELEASE_POSTFIX) set(CMAKE_RELEASE_POSTFIX "_release") endif() endif() SET(CMAKE_CXX_FLAGS_MAINTAINER "-pedantic -Wno-variadic-macros -Wabi -Wextra -Weffc++" CACHE STRING "" FORCE) SET(CMAKE_C_FLAGS_MAINTAINER "-pedantic -Wno-variadic-macros -Wabi -Wextra -Weffc++" CACHE STRING "" FORCE) SET(CMAKE_EXE_LINKER_FLAGS_MAINTAINER "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING "" FORCE) SET(CMAKE_SHARED_LINKER_FLAGS_MAINTAINER "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING "" FORCE) MARK_AS_ADVANCED( CMAKE_CXX_FLAGS_MAINTAINER CMAKE_C_FLAGS_MAINTAINER CMAKE_EXE_LINKER_FLAGS_MAINTAINER CMAKE_SHARED_LINKER_FLAGS_MAINTAINER ) SET(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Maintainer." FORCE) option(PCL_SHARED_LIBS ON) if (ANDROID_NDK) set (PCL_SHARED_LIBS OFF) message ("PCL shared libs on Android must be: ${PCL_SHARED_LIBS}") endif() include(${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake) include(${PCL_SOURCE_DIR}/cmake/pcl_options.cmake) if(CMAKE_COMPILER_IS_GNUCXX) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unknown-pragmas -fno-strict-aliasing -pthread") if(WIN32) if(PCL_SHARED_LIBS) SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-all-symbols -Wl,--enable-auto-import") else(PCL_SHARED_LIBS) add_definitions("-DBOOST_LIB_DIAGNOSTIC -DBOOST_THREAD_USE_LIB") endif(PCL_SHARED_LIBS) endif() endif() if(MSVC) add_definitions ("-DBOOST_ALL_NO_LIB -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -DNOMINMAX") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj /EHsc /fp:fast") if(MSVC90 OR MSVC10) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") endif() endif() include(${PCL_SOURCE_DIR}/cmake/pcl_find_sse.cmake) PCL_CHECK_FOR_SSE() if (__COMPILER_PATHSCALE) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-uninitialized -zerouv -pthread -mp") endif() if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") endif() option(USE_PROJECT_FOLDERS "Use folders to organize PCL projects in an IDE." OFF) mark_as_advanced(USE_PROJECT_FOLDERS) if(USE_PROJECT_FOLDERS) set_property(GLOBAL PROPERTY USE_FOLDERS ON) endif(USE_PROJECT_FOLDERS) include(${PCL_SOURCE_DIR}/cmake/pcl_utils.cmake) set(PCL_VERSION 1.5.1 CACHE STRING "PCL version") DISSECT_VERSION() GET_OS_INFO() SET_INSTALL_DIRS() if(WIN32) set(PCL_RESOURCES_DIR ${PCL_SOURCE_DIR}/resources) set(PCL_POINTCLOUDS_DIR ${PCL_RESOURCES_DIR}/pointclouds) endif(WIN32) set(PCL_OUTPUT_LIB_DIR ${PCL_BINARY_DIR}/${LIB_INSTALL_DIR}) set(PCL_OUTPUT_BIN_DIR ${PCL_BINARY_DIR}/${BIN_INSTALL_DIR}) make_directory(${PCL_OUTPUT_LIB_DIR}) make_directory(${PCL_OUTPUT_BIN_DIR}) if(WIN32) foreach(config ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${config} CONFIG) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIG} "${PCL_OUTPUT_LIB_DIR}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG} "${PCL_OUTPUT_BIN_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIG} "${PCL_OUTPUT_BIN_DIR}") endforeach(config) else(WIN32) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PCL_OUTPUT_LIB_DIR}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PCL_OUTPUT_BIN_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PCL_OUTPUT_LIB_DIR}") endif(WIN32) configure_file("${PCL_SOURCE_DIR}/cmake/uninstall_target.cmake.in" "${PCL_BINARY_DIR}/uninstall_target.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${PCL_BINARY_DIR}/uninstall_target.cmake") SET(CMAKE_SKIP_BUILD_RPATH FALSE) SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}") SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}" is_system_dir) IF("${is_system_dir}" STREQUAL "-1") SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}") ENDIF("${is_system_dir}" STREQUAL "-1") option(BUILD_OPENNI ON) option(BUILD_TESTS OFF) option(BUILD_all_in_one_installer OFF) option(BUILD_apps ON) option(BUILD_common ON) option(BUILD_examples ON) option(BUILD_features ON) option(BUILD_filters ON) option(BUILD_global_tests OFF) option(BUILD_io ON) option(BUILD_kdtree ON) option(BUILD_keypoints ON) option(BUILD_octree ON) option(BUILD_registration ON) option(BUILD_sample_consensus ON) option(BUILD_search ON) option(BUILD_segmentation ON) option(BUILD_surface ON) option(BUILD_tools ON) option(BUILD_tracking ON) option(BUILD_visualization ON) if(WIN32) if(NOT DEFINED BOOST_ROOT AND DEFINED ENV{BOOST_ROOT}) set(BOOST_ROOT $ENV{BOOST_ROOT} CACHE PATH "BOOST_ROOT") endif() if(NOT DEFINED Boost_INCLUDE_DIR) if(DEFINED BOOST_ROOT AND EXISTS "${BOOST_ROOT}/include") set(Boost_INCLUDE_DIR "${BOOST_ROOT}/include") elseif(DEFINED ENV{BOOST_ROOT} AND EXISTS "$ENV{BOOST_ROOT}/include") set(Boost_INCLUDE_DIR "$ENV{BOOST_ROOT}/include") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/include") set(Boost_INCLUDE_DIR "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/include") else() set(Boost_INCLUDE_DIR "") endif() endif() set(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" CACHE PATH "Boost_INCLUDE_DIR" FORCE) mark_as_advanced(CLEAR Boost_INCLUDE_DIR) if(Boost_INCLUDE_DIR AND EXISTS "${Boost_INCLUDE_DIR}") include_directories("${Boost_INCLUDE_DIR}") endif() if(NOT DEFINED Boost_LIBRARY_DIR_RELEASE) if(EXISTS "${BOOST_ROOT}/lib/Release") set(Boost_LIBRARY_DIR_RELEASE "${BOOST_ROOT}/lib/Release") elseif(EXISTS "${BOOST_ROOT}/stage/lib") set(Boost_LIBRARY_DIR_RELEASE "${BOOST_ROOT}/stage/lib") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/lib/Release") set(Boost_LIBRARY_DIR_RELEASE "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/lib/Release") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/lib") set(Boost_LIBRARY_DIR_RELEASE "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/lib") else() set(Boost_LIBRARY_DIR_RELEASE "") endif() endif() if(NOT DEFINED Boost_LIBRARY_DIR_DEBUG) if(EXISTS "${BOOST_ROOT}/lib/Debug") set(Boost_LIBRARY_DIR_DEBUG "${BOOST_ROOT}/lib/Debug") elseif(EXISTS "${BOOST_ROOT}/stage/lib") set(Boost_LIBRARY_DIR_DEBUG "${BOOST_ROOT}/stage/lib") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/lib/Debug") set(Boost_LIBRARY_DIR_DEBUG "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/lib/Debug") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/lib") set(Boost_LIBRARY_DIR_DEBUG "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Boost1.69/lib") else() set(Boost_LIBRARY_DIR_DEBUG "") endif() endif() set(Boost_LIBRARY_DIR_RELEASE "${Boost_LIBRARY_DIR_RELEASE}" CACHE PATH "Boost_LIBRARY_DIR_RELEASE" FORCE) set(Boost_LIBRARY_DIR_DEBUG "${Boost_LIBRARY_DIR_DEBUG}" CACHE PATH "Boost_LIBRARY_DIR_DEBUG" FORCE) mark_as_advanced(CLEAR Boost_LIBRARY_DIR_RELEASE Boost_LIBRARY_DIR_DEBUG) if(Boost_LIBRARY_DIR_RELEASE AND EXISTS "${Boost_LIBRARY_DIR_RELEASE}") link_directories("${Boost_LIBRARY_DIR_RELEASE}") endif() if(Boost_LIBRARY_DIR_DEBUG AND EXISTS "${Boost_LIBRARY_DIR_DEBUG}") link_directories("${Boost_LIBRARY_DIR_DEBUG}") endif() find_library(Boost_SYSTEM_LIBRARY_RELEASE NAMES boost_system boost_system-mt boost_system-vc90-mt boost_system-vc90-mt-1_69 libboost_system-vc90-mt-1_69 HINTS "${Boost_LIBRARY_DIR_RELEASE}" "${Boost_LIBRARY_DIR_DEBUG}") find_library(Boost_SYSTEM_LIBRARY_DEBUG NAMES boost_system-gd boost_system-mt-gd boost_system-vc90-mt-gd boost_system-vc90-mt-gd-1_69 libboost_system-vc90-mt-gd-1_69 HINTS "${Boost_LIBRARY_DIR_DEBUG}" "${Boost_LIBRARY_DIR_RELEASE}") find_library(Boost_FILESYSTEM_LIBRARY_RELEASE NAMES boost_filesystem boost_filesystem-mt boost_filesystem-vc90-mt boost_filesystem-vc90-mt-1_69 libboost_filesystem-vc90-mt-1_69 HINTS "${Boost_LIBRARY_DIR_RELEASE}" "${Boost_LIBRARY_DIR_DEBUG}") find_library(Boost_FILESYSTEM_LIBRARY_DEBUG NAMES boost_filesystem-gd boost_filesystem-mt-gd boost_filesystem-vc90-mt-gd boost_filesystem-vc90-mt-gd-1_69 libboost_filesystem-vc90-mt-gd-1_69 HINTS "${Boost_LIBRARY_DIR_DEBUG}" "${Boost_LIBRARY_DIR_RELEASE}") find_library(Boost_THREAD_LIBRARY_RELEASE NAMES boost_thread boost_thread-mt boost_thread-vc90-mt boost_thread-vc90-mt-1_69 libboost_thread-vc90-mt-1_69 HINTS "${Boost_LIBRARY_DIR_RELEASE}" "${Boost_LIBRARY_DIR_DEBUG}") find_library(Boost_THREAD_LIBRARY_DEBUG NAMES boost_thread-gd boost_thread-mt-gd boost_thread-vc90-mt-gd boost_thread-vc90-mt-gd-1_69 libboost_thread-vc90-mt-gd-1_69 HINTS "${Boost_LIBRARY_DIR_DEBUG}" "${Boost_LIBRARY_DIR_RELEASE}") find_library(Boost_DATE_TIME_LIBRARY_RELEASE NAMES boost_date_time boost_date_time-mt boost_date_time-vc90-mt boost_date_time-vc90-mt-1_69 libboost_date_time-vc90-mt-1_69 HINTS "${Boost_LIBRARY_DIR_RELEASE}" "${Boost_LIBRARY_DIR_DEBUG}") find_library(Boost_DATE_TIME_LIBRARY_DEBUG NAMES boost_date_time-gd boost_date_time-mt-gd boost_date_time-vc90-mt-gd boost_date_time-vc90-mt-gd-1_69 libboost_date_time-vc90-mt-gd-1_69 HINTS "${Boost_LIBRARY_DIR_DEBUG}" "${Boost_LIBRARY_DIR_RELEASE}") find_library(Boost_IOSTREAMS_LIBRARY_RELEASE NAMES boost_iostreams boost_iostreams-mt boost_iostreams-vc90-mt boost_iostreams-vc90-mt-1_69 libboost_iostreams-vc90-mt-1_69 HINTS "${Boost_LIBRARY_DIR_RELEASE}" "${Boost_LIBRARY_DIR_DEBUG}") find_library(Boost_IOSTREAMS_LIBRARY_DEBUG NAMES boost_iostreams-gd boost_iostreams-mt-gd boost_iostreams-vc90-mt-gd boost_iostreams-vc90-mt-gd-1_69 libboost_iostreams-vc90-mt-gd-1_69 HINTS "${Boost_LIBRARY_DIR_DEBUG}" "${Boost_LIBRARY_DIR_RELEASE}") find_library(Boost_SERIALIZATION_LIBRARY_RELEASE NAMES boost_serialization boost_serialization-mt boost_serialization-vc90-mt boost_serialization-vc90-mt-1_69 libboost_serialization-vc90-mt-1_69 HINTS "${Boost_LIBRARY_DIR_RELEASE}" "${Boost_LIBRARY_DIR_DEBUG}") find_library(Boost_SERIALIZATION_LIBRARY_DEBUG NAMES boost_serialization-gd boost_serialization-mt-gd boost_serialization-vc90-mt-gd boost_serialization-vc90-mt-gd-1_69 libboost_serialization-vc90-mt-gd-1_69 HINTS "${Boost_LIBRARY_DIR_DEBUG}" "${Boost_LIBRARY_DIR_RELEASE}") find_library(Boost_MPl_LIBRARY_RELEASE NAMES boost_mpi boost_mpi-mt boost_mpi-vc90-mt HINTS "${Boost_LIBRARY_DIR_RELEASE}" "${Boost_LIBRARY_DIR_DEBUG}") find_library(Boost_MPl_LIBRARY_DEBUG NAMES boost_mpi-gd boost_mpi-mt-gd boost_mpi-vc90-mt-gd HINTS "${Boost_LIBRARY_DIR_DEBUG}" "${Boost_LIBRARY_DIR_RELEASE}") set(Boost_SYSTEM_LIBRARY_RELEASE "${Boost_SYSTEM_LIBRARY_RELEASE}" CACHE FILEPATH "Boost_SYSTEM_LIBRARY_RELEASE") set(Boost_SYSTEM_LIBRARY_DEBUG "${Boost_SYSTEM_LIBRARY_DEBUG}" CACHE FILEPATH "Boost_SYSTEM_LIBRARY_DEBUG") set(Boost_FILESYSTEM_LIBRARY_RELEASE "${Boost_FILESYSTEM_LIBRARY_RELEASE}" CACHE FILEPATH "Boost_FILESYSTEM_LIBRARY_RELEASE") set(Boost_FILESYSTEM_LIBRARY_DEBUG "${Boost_FILESYSTEM_LIBRARY_DEBUG}" CACHE FILEPATH "Boost_FILESYSTEM_LIBRARY_DEBUG") set(Boost_THREAD_LIBRARY_RELEASE "${Boost_THREAD_LIBRARY_RELEASE}" CACHE FILEPATH "Boost_THREAD_LIBRARY_RELEASE") set(Boost_THREAD_LIBRARY_DEBUG "${Boost_THREAD_LIBRARY_DEBUG}" CACHE FILEPATH "Boost_THREAD_LIBRARY_DEBUG") set(Boost_DATE_TIME_LIBRARY_RELEASE "${Boost_DATE_TIME_LIBRARY_RELEASE}" CACHE FILEPATH "Boost_DATE_TIME_LIBRARY_RELEASE") set(Boost_DATE_TIME_LIBRARY_DEBUG "${Boost_DATE_TIME_LIBRARY_DEBUG}" CACHE FILEPATH "Boost_DATE_TIME_LIBRARY_DEBUG") set(Boost_IOSTREAMS_LIBRARY_RELEASE "${Boost_IOSTREAMS_LIBRARY_RELEASE}" CACHE FILEPATH "Boost_IOSTREAMS_LIBRARY_RELEASE") set(Boost_IOSTREAMS_LIBRARY_DEBUG "${Boost_IOSTREAMS_LIBRARY_DEBUG}" CACHE FILEPATH "Boost_IOSTREAMS_LIBRARY_DEBUG") set(Boost_SERIALIZATION_LIBRARY_RELEASE "${Boost_SERIALIZATION_LIBRARY_RELEASE}" CACHE FILEPATH "Boost_SERIALIZATION_LIBRARY_RELEASE") set(Boost_SERIALIZATION_LIBRARY_DEBUG "${Boost_SERIALIZATION_LIBRARY_DEBUG}" CACHE FILEPATH "Boost_SERIALIZATION_LIBRARY_DEBUG") mark_as_advanced(CLEAR PCL_SHARED_LIBS Boost_INCLUDE_DIR Boost_LIBRARY_DIR_RELEASE Boost_LIBRARY_DIR_DEBUG Boost_SYSTEM_LIBRARY_RELEASE Boost_SYSTEM_LIBRARY_DEBUG Boost_FILESYSTEM_LIBRARY_RELEASE Boost_FILESYSTEM_LIBRARY_DEBUG Boost_THREAD_LIBRARY_RELEASE Boost_THREAD_LIBRARY_DEBUG Boost_DATE_TIME_LIBRARY_RELEASE Boost_DATE_TIME_LIBRARY_DEBUG Boost_IOSTREAMS_LIBRARY_RELEASE Boost_IOSTREAMS_LIBRARY_DEBUG Boost_SERIALIZATION_LIBRARY_RELEASE Boost_SERIALIZATION_LIBRARY_DEBUG ) endif() if(WIN32) if(NOT DEFINED EIGEN3_ROOT AND DEFINED ENV{EIGEN3_ROOT}) set(EIGEN3_ROOT $ENV{EIGEN3_ROOT} CACHE PATH "EIGEN3_ROOT") endif() if(NOT DEFINED EIGEN_INCLUDE_DIRS) if(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Eigen3/Release/include/Eigen/Core") set(EIGEN_INCLUDE_DIRS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Eigen3/Release/include" CACHE PATH "EIGEN_INCLUDE_DIRS") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Eigen3/include/Eigen/Core") set(EIGEN_INCLUDE_DIRS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/Eigen3/include" CACHE PATH "EIGEN_INCLUDE_DIRS") endif() endif() if(EIGEN_INCLUDE_DIRS) include_directories(${EIGEN_INCLUDE_DIRS}) endif() endif() if(WIN32) if(NOT DEFINED FLANN_ROOT AND DEFINED ENV{FLANN_ROOT}) set(FLANN_ROOT $ENV{FLANN_ROOT} CACHE PATH "FLANN_ROOT") endif() if(NOT DEFINED FLANN_INCLUDE_DIR) if(DEFINED FLANN_ROOT AND EXISTS "${FLANN_ROOT}/Release/include") set(FLANN_INCLUDE_DIR "${FLANN_ROOT}/Release/include") elseif(DEFINED FLANN_ROOT AND EXISTS "${FLANN_ROOT}/include") set(FLANN_INCLUDE_DIR "${FLANN_ROOT}/include") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/FLANN/Release/include") set(FLANN_INCLUDE_DIR "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/FLANN/Release/include") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/FLANN/include") set(FLANN_INCLUDE_DIR "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/FLANN/include") else() set(FLANN_INCLUDE_DIR "") endif() endif() set(FLANN_INCLUDE_DIR "${FLANN_INCLUDE_DIR}" CACHE PATH "FLANN_INCLUDE_DIR" FORCE) mark_as_advanced(CLEAR FLANN_INCLUDE_DIR) if(FLANN_INCLUDE_DIR AND EXISTS "${FLANN_INCLUDE_DIR}") include_directories("${FLANN_INCLUDE_DIR}") endif() find_library(FLANN_LIBRARY_RELEASE NAMES flann_cpp_s flann_cpp flann HINTS "${FLANN_ROOT}/Release/lib" "${FLANN_ROOT}/lib") find_library(FLANN_LIBRARY_DEBUG NAMES flann_cpp_s-gd flann_cpp-gd flann-gd HINTS "${FLANN_ROOT}/Debug/lib" "${FLANN_ROOT}/lib") if(FLANN_LIBRARY_RELEASE) set(FLANN_LIBRARY "${FLANN_LIBRARY_RELEASE}" CACHE FILEPATH "FLANN_LIBRARY") endif() if(FLANN_LIBRARY_DEBUG) set(FLANN_LIBRARY_DEBUG "${FLANN_LIBRARY_DEBUG}" CACHE FILEPATH "FLANN_LIBRARY_DEBUG") endif() endif() if(WIN32) if(NOT DEFINED QHULL_ROOT AND DEFINED ENV{QHULL_ROOT}) set(QHULL_ROOT $ENV{QHULL_ROOT} CACHE PATH "QHULL_ROOT") endif() if(NOT DEFINED QHULL_INCLUDE_DIR) if(DEFINED QHULL_ROOT AND EXISTS "${QHULL_ROOT}/Release/include/qhull/qhull.h") set(QHULL_INCLUDE_DIR "${QHULL_ROOT}/Release/include") elseif(DEFINED QHULL_ROOT AND EXISTS "${QHULL_ROOT}/Release/include/libqhull/qhull.h") set(QHULL_INCLUDE_DIR "${QHULL_ROOT}/Release/include") elseif(DEFINED QHULL_ROOT AND EXISTS "${QHULL_ROOT}/include/qhull/qhull.h") set(QHULL_INCLUDE_DIR "${QHULL_ROOT}/include") elseif(DEFINED QHULL_ROOT AND EXISTS "${QHULL_ROOT}/include/libqhull/qhull.h") set(QHULL_INCLUDE_DIR "${QHULL_ROOT}/include") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/qhull-v7.2.0/Release/include/qhull/qhull.h" OR EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/qhull-v7.2.0/Release/include/libqhull/qhull.h") set(QHULL_INCLUDE_DIR "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/qhull-v7.2.0/Release/include") elseif(EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/qhull-v7.2.0/include/qhull/qhull.h" OR EXISTS "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/qhull-v7.2.0/include/libqhull/qhull.h") set(QHULL_INCLUDE_DIR "E:/PointCloudLibrary/VS2008_V90_X64/3rdparty/qhull-v7.2.0/include") else() set(QHULL_INCLUDE_DIR "") endif() endif() set(QHULL_INCLUDE_DIR "${QHULL_INCLUDE_DIR}" CACHE PATH "QHULL_INCLUDE_DIR" FORCE) mark_as_advanced(CLEAR QHULL_INCLUDE_DIR) if(QHULL_INCLUDE_DIR AND EXISTS "${QHULL_INCLUDE_DIR}") include_directories("${QHULL_INCLUDE_DIR}") endif() find_library(QHULL_LIBRARY_RELEASE NAMES qhullstatic qhull HINTS "${QHULL_ROOT}/Release/lib" "${QHULL_ROOT}/lib") find_library(QHULL_LIBRARY_DEBUG NAMES qhullstatic_d qhull_d HINTS "${QHULL_ROOT}/Debug/lib" "${QHULL_ROOT}/lib") if(QHULL_LIBRARY_RELEASE) set(QHULL_LIBRARY "${QHULL_LIBRARY_RELEASE}" CACHE FILEPATH "QHULL_LIBRARY") endif() if(QHULL_LIBRARY_DEBUG) set(QHULL_LIBRARY_DEBUG "${QHULL_LIBRARY_DEBUG}" CACHE FILEPATH "QHULL_LIBRARY_DEBUG") endif() endif() if(WIN32) if(NOT DEFINED VTK_DIR AND DEFINED ENV{VTK_DIR}) set(VTK_DIR $ENV{VTK_DIR} CACHE PATH "VTK_DIR") endif() if(NOT DEFINED VTK_DIR AND DEFINED ENV{VTK_BASE_DIR}) if(EXISTS "$ENV{VTK_BASE_DIR}/Release/lib/vtk-5.8") set(VTK_DIR "$ENV{VTK_BASE_DIR}/Release/lib/vtk-5.8" CACHE PATH "VTK_DIR") elseif(EXISTS "$ENV{VTK_BASE_DIR}/Debug/lib/vtk-5.8") set(VTK_DIR "$ENV{VTK_BASE_DIR}/Debug/lib/vtk-5.8" CACHE PATH "VTK_DIR") endif() endif() if(DEFINED ENV{QTDIR}) set(CMAKE_PREFIX_PATH "$ENV{QTDIR}" "$ENV{QTDIR}/lib/cmake" ${CMAKE_PREFIX_PATH}) set(QT_PLUGINS_DIR "$ENV{QTDIR}/plugins" CACHE PATH "QT_PLUGINS_DIR") set(QT_DOC_DIR "$ENV{QTDIR}/doc" CACHE PATH "QT_DOC_DIR") set(QT_IMPORTS_DIR "$ENV{QTDIR}/imports" CACHE PATH "QT_IMPORTS_DIR") set(QT_MKSPECS_DIR "$ENV{QTDIR}/mkspecs" CACHE PATH "QT_MKSPECS_DIR") find_program(QT_MOC_EXECUTABLE NAMES moc PATHS "$ENV{QTDIR}/bin") find_program(QT_LRELEASE_EXECUTABLE NAMES lrelease PATHS "$ENV{QTDIR}/bin") find_program(QT_LUPDATE_EXECUTABLE NAMES lupdate PATHS "$ENV{QTDIR}/bin") find_program(QT_DESIGNER_EXECUTABLE NAMES designer PATHS "$ENV{QTDIR}/bin") find_program(QT_DBUSXML2CPP_EXECUTABLE NAMES qdbusxml2cpp PATHS "$ENV{QTDIR}/bin") find_program(QT_DBUSCPP2XML_EXECUTABLE NAMES qdbuscpp2xml PATHS "$ENV{QTDIR}/bin") find_library(QT_QAXCONTAINER_LIBRARY_RELEASE NAMES QAxContainer PATHS "$ENV{QTDIR}/lib") find_library(QT_QAXCONTAINER_LIBRARY_DEBUG NAMES QAxContainerd PATHS "$ENV{QTDIR}/lib") if(QT_QAXCONTAINER_LIBRARY_RELEASE) set(QT_QAxCONTAINER_LIBRARY "${QT_QAXCONTAINER_LIBRARY_RELEASE}" CACHE FILEPATH "QT_QAxCONTAINER_LIBRARY") endif() if(QT_QAXCONTAINER_LIBRARY_DEBUG) set(QT_QAXCONTAINER_LIBRARY_DEBUG "${QT_QAXCONTAINER_LIBRARY_DEBUG}" CACHE FILEPATH "QT_QAxCONTAINER_LIBRARY_DEBUG") endif() find_library(QT_PHONON_LIBRARY_RELEASE NAMES phonon phonon4 PATHS "$ENV{QTDIR}/lib") find_library(QT_PHONON_LIBRARY_DEBUG NAMES phonond phonon4d PATHS "$ENV{QTDIR}/lib") if(QT_PHONON_LIBRARY_RELEASE) set(QT_PHONON_LIBRARY "${QT_PHONON_LIBRARY_RELEASE}" CACHE FILEPATH "QT_PHONON_LIBRARY") endif() if(QT_PHONON_LIBRARY_DEBUG) set(QT_PHONON_LIBRARY_DEBUG "${QT_PHONON_LIBRARY_DEBUG}" CACHE FILEPATH "QT_PHONON_LIBRARY_DEBUG") endif() find_library(QT_PHONONWIDGETS_LIBRARY_RELEASE NAMES phononwidgets PATHS "$ENV{QTDIR}/lib") find_library(QT_PHONONWIDGETS_LIBRARY_DEBUG NAMES phononwidgetsd PATHS "$ENV{QTDIR}/lib") if(QT_PHONONWIDGETS_LIBRARY_RELEASE) set(QT_PHONONwWIDGETS_LIBRARY "${QT_PHONONWIDGETS_LIBRARY_RELEASE}" CACHE FILEPATH "QT_PHONONwWIDGETS_LIBRARY") set(QT_PHONONWIDGETS_LIBRARY_RELEASE "${QT_PHONONWIDGETS_LIBRARY_RELEASE}" CACHE FILEPATH "QT_PHONONWIDGETS_LIBRARY_RELEASE") endif() if(QT_PHONONWIDGETS_LIBRARY_DEBUG) set(QT_PHONONWIDGETS_LIBRARY_DEBUG "${QT_PHONONWIDGETS_LIBRARY_DEBUG}" CACHE FILEPATH "QT_PHONONWIDGETS_LIBRARY_DEBUG") endif() set(QT_PHONON_INCLUDE_DIR "$ENV{QTDIR}/include/phonon" CACHE PATH "QT_PHONON_INCLUDE_DIR") endif() endif() FIND_PACKAGE(OpenMP) if(OPENMP_FOUND) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") endif() include(${PCL_SOURCE_DIR}/cmake/pcl_find_boost.cmake) find_package(Eigen REQUIRED) include_directories(SYSTEM ${EIGEN_INCLUDE_DIRS}) add_definitions(-DEIGEN_USE_NEW_STDVECTOR -DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET) find_package(Flann REQUIRED) include_directories(SYSTEM ${FLANN_INCLUDE_DIRS}) find_package(OpenNI) find_package(Qhull) include(${PCL_SOURCE_DIR}/cmake/pcl_find_ros.cmake) find_package(Qt4) if (QT4_FOUND) include(${QT_USE_FILE}) endif (QT4_FOUND) find_package(VTK) if(VTK_FOUND) set(VTK_FOUND TRUE) find_package (QVTK) message(STATUS "VTK found (include: ${VTK_INCLUDE_DIRS}, lib: ${VTK_LIBRARY_DIRS})") link_directories(${VTK_LIBRARY_DIRS}) set(HAVE_VTK ON) endif(VTK_FOUND) find_package(MPI) if(MPI_CXX_FOUND) include_directories(SYSTEM ${MPI_INCLUDE_PATH}) endif(MPI_CXX_FOUND) find_package(Doxygen) if(DOXYGEN_FOUND) find_package(HTMLHelp) endif(DOXYGEN_FOUND) set(pcl_config_h_in "${CMAKE_CURRENT_SOURCE_DIR}/pcl_config.h.in") set(pcl_config_h "${CMAKE_CURRENT_BINARY_DIR}/include/pcl/pcl_config.h") configure_file(${pcl_config_h_in} ${pcl_config_h}) PCL_ADD_INCLUDES(common "" ${pcl_config_h}) include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) include(${PCL_SOURCE_DIR}/cmake/pcl_tests.cmake) include(${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake) collect_subproject_directory_names(${PCL_SOURCE_DIR} "CMakeLists.txt" PCL_MODULES_NAMES PCL_MODULES_DIRS doc) set(PCL_MODULES_NAMES_UNSORTED ${PCL_MODULES_NAMES}) topological_sort(PCL_MODULES_NAMES PCL_ _DEPENDS) message ("Unsorted modules: ${PCL_MODULES_NAMES_UNSORTED}") message ("Modules: ${PCL_MODULES_NAMES}") sort_relative(PCL_MODULES_NAMES_UNSORTED PCL_MODULES_NAMES PCL_MODULES_DIRS) foreach(subdir ${PCL_MODULES_DIRS}) add_subdirectory(${PCL_SOURCE_DIR}/${subdir}) endforeach(subdir) add_subdirectory(doc) include(${PCL_SOURCE_DIR}/cmake/pcl_pclconfig.cmake) include(${PCL_SOURCE_DIR}/cmake/pcl_all_in_one_installer.cmake) include(${PCL_SOURCE_DIR}/cmake/pcl_cpack.cmake) if(CPACK_GENERATOR) message(STATUS "Found CPack generators: ${CPACK_GENERATOR}") PCL_MAKE_CPACK_INPUT() set(CPACK_PROJECT_CONFIG_FILE "${PCL_CPACK_CFG_FILE}") include(CPack) endif(CPACK_GENERATOR) include(${PCL_SOURCE_DIR}/cmake/dep_graph.cmake) MAKE_DEP_GRAPH() PCL_WRITE_STATUS_REPORT() PCL_RESET_MAPS() 现在 Boost_LIBRARY_DIR_DEBUG Boost_LIBRARY_DIR_RELEASE这两个没有显示出来能否帮我修改一下是实现Boost_LIBRARY_DIR_DEBUG Boost_LIBRARY_DIR_RELEASE这两个显示出来
最新发布
12-15
cmake_minimum_required(VERSION 3.20) # 设置项目名称和版本 project(DTENApp LANGUAGES CXX VERSION 1.1.2.0729) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找 Qt6 find_package(Qt6 REQUIRED COMPONENTS Quick Widgets Sql Multimedia) qt_standard_project_setup(REQUIRES 6.5) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # 只在 Xcode 生成器中设置代码签名 if(CMAKE_GENERATOR STREQUAL "Xcode") set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY_RELEASE "Apple Distribution") set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO") set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "YES") endif() # 设置第三方库路径 set(DTENLog_DIR "${CMAKE_SOURCE_DIR}/thirdpart/DTENLog") set(DTENLog_INCLUDE_DIRS "${DTENLog_DIR}/include/mac") set(ChannelMgr_DIR "${CMAKE_SOURCE_DIR}/thirdpart/ChannelMgr/mac") set(ChannelMgr_INCLUDE_DIRS "${ChannelMgr_DIR}/include") # 设置库文件路径 if(APPLE) set(DTENLog_LIBRARY "${DTENLog_DIR}/lib/libglog.dylib") set(ChannelMgr_LIBRARY "${ChannelMgr_DIR}/lib/libChannelMgr.dylib") else() set(DTENLog_LIBRARY "${DTENLog_DIR}/lib/DTENLog.lib") endif() # 平台特定配置 if(WIN32) message(STATUS "Windows platform detected, configuring version info...") set(MY_VERSIONINFO_RC "${CMAKE_CURRENT_SOURCE_DIR}/VersionInfo.rc") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/VersionInfo.rc.in" "${MY_VERSIONINFO_RC}") list(APPEND SOURCES ${MY_VERSIONINFO_RC}) if(MSVC) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") endif() qt_add_executable(${PROJECT_NAME} WIN32 Main.cpp logo.rc ${MY_VERSIONINFO_RC} ) elseif(APPLE) message(STATUS "macOS platform detected, configuring bundle...") # macOS 特定设置 set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++17") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") # 创建应用程序包 set(MACOSX_BUNDLE_BUNDLE_NAME "DTENApp") set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") set(MACOSX_BUNDLE_COPYRIGHT "Copyright © 2023 My Company") set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.dten.${PROJECT_NAME}") set(MACOSX_BUNDLE_ICON_FILE "AppIcon") # 添加可执行文件 add_executable(${PROJECT_NAME} MACOSX_BUNDLE Main.cpp) # 设置目标属性 set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Mac/Info.plist XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/Mac/DTENApp.entitlements" BUNDLE True MACOSX_BUNDLE True ) # 添加资源文件 set(RESOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/DTENApp.icns" "${CMAKE_CURRENT_SOURCE_DIR}/qml.qrc" ) # 复制资源文件到 bundle foreach(resource ${RESOURCE_FILES}) get_filename_component(resource_name ${resource} NAME) set_source_files_properties(${resource} PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) target_sources(${PROJECT_NAME} PRIVATE ${resource}) endforeach() # 链接 macOS 框架 find_library(COCOA_LIBRARY Cocoa) find_library(FOUNDATION_LIBRARY Foundation) find_library(IOKIT_LIBRARY IOKit) find_library(CARBON_LIBRARY Carbon) target_include_directories(${PROJECT_NAME} PRIVATE ${DTENLog_DIR} ${DTENLog_INCLUDE_DIRS} "${ChannelMgr_INCLUDE_DIRS}" ) target_link_libraries(${PROJECT_NAME} PRIVATE ${COCOA_LIBRARY} ${FOUNDATION_LIBRARY} ${IOKIT_LIBRARY} ${CARBON_LIBRARY} ${DTENLog_LIBRARY} ${ChannelMgr_LIBRARY} ) # 添加 rpath 以便在 macOS 上找到 Qt 库 set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "@executable_path/../Frameworks" BUILD_WITH_INSTALL_RPATH TRUE MACOSX_RPATH ON ) # 自动复制库到程序的 Frameworks 目录 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${PROJECT_NAME}>/../Frameworks" COMMAND ${CMAKE_COMMAND} -E copy "${DTENLog_LIBRARY}" "${ChannelMgr_LIBRARY}" "$<TARGET_FILE_DIR:${PROJECT_NAME}>/../Frameworks/" COMMENT "Copied libraries to Frameworks" ) endif() # 添加 QML 模块 qt_add_qml_module(${PROJECT_NAME} URI DTENApp VERSION 1.0 QML_FILES Main.qml RESOURCES qml.qrc SOURCES LogInit.h userdefdata.h DeviceControl.h DeviceControl.cpp DealChannelMsg.h DealChannelMsg.cpp CreateChannelMsg.h CreateChannelMsg.cpp FileInfo.h FileInfo.cpp WindowManager.h WindowManager.cpp ProcessManager.h ProcessManager.cpp TaskQueue.h TaskQueue.cpp DeviceCheck.h DeviceCheck.cpp Interface.h Interface.cpp NetworkManager.h NetworkManager.cpp NV12VideoSource.h NV12VideoSource.cpp DBManager.h DBManager.cpp CameraControl.h CameraControl.cpp UdpClient.h UdpClient.cpp ) # 链接库 target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Quick Qt6::Widgets Qt6::Sql Qt6::Multimedia ${DTENLog_LIBRARY} ${ChannelMgr_LIBRARY} ) # 添加宏定义 target_compile_definitions(${PROJECT_NAME} PRIVATE GLOG_NO_ABBREVIATED_SEVERITIES ) # 在 macOS 上添加额外的链接选项 if(APPLE) # 确保链接器能找到 Qt 框架 target_link_options(${PROJECT_NAME} PRIVATE -F${Qt6_DIR}/../../.. ) # 添加必要的框架 target_link_libraries(${PROJECT_NAME} PRIVATE "-framework AppKit" "-framework Foundation" "-framework CoreGraphics" "-framework CoreVideo" "-framework CoreMedia" "-framework OpenGL" "-framework IOKit" "-framework Carbon" ) # 查找 macdeployqt 工具 get_target_property(QMAKE_LOCATION Qt6::qmake IMPORTED_LOCATION) get_filename_component(QT_BIN_DIR "${QMAKE_LOCATION}" DIRECTORY) find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${QT_BIN_DIR}") if(MACDEPLOYQT_EXECUTABLE) message(STATUS "Found macdeployqt: ${MACDEPLOYQT_EXECUTABLE}") set(QT_MACDEPLOYQT_EXECUTABLE "${MACDEPLOYQT_EXECUTABLE}") else() message(WARNING "macdeployqt not found - manual deployment required") endif() # QML 文件部署 set(QML_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE PATH "Directory containing QML files") # 查找 QML 文件 file(GLOB_RECURSE QML_FILES "${QML_SOURCE_DIR}/*.qml" "${QML_SOURCE_DIR}/*.qmlc" ) if(QML_FILES) # 安装 QML 文件(保持目录结构) foreach(QML_FILE ${QML_FILES}) file(RELATIVE_PATH RELATIVE_QML_PATH "${QML_SOURCE_DIR}" "${QML_FILE}") get_filename_component(RELATIVE_DIR "${RELATIVE_QML_PATH}" DIRECTORY) install(FILES "${QML_FILE}" DESTINATION "${PROJECT_NAME}.app/Contents/Resources/qml/${RELATIVE_DIR}" COMPONENT Runtime ) endforeach() # 统计信息 list(LENGTH QML_FILES QML_FILES_COUNT) message(STATUS "Installed ${QML_FILES_COUNT} QML files") # 部署 QML 导入路径 execute_process( COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_QML OUTPUT_VARIABLE QT_QML_IMPORT_PATH OUTPUT_STRIP_TRAILING_WHITESPACE ) # 修正:部署正确的 QML 模块(Widgets、Sql、Multimedia 是 C++ 库,不是 QML 模块) set(QML_MODULES_TO_DEPLOY QtQuick QtQuick/Controls QtQuick/Layouts QtMultimedia # 多媒体 QML 模块 # 添加您的项目所需的其他 QML 模块 ) foreach(MODULE ${QML_MODULES_TO_DEPLOY}) if(EXISTS "${QT_QML_IMPORT_PATH}/${MODULE}") install(DIRECTORY "${QT_QML_IMPORT_PATH}/${MODULE}" DESTINATION "${PROJECT_NAME}.app/Contents/Resources/qml" COMPONENT Runtime ) message(STATUS "Deploying QML module: ${MODULE}") else() message(WARNING "QML module not found: ${MODULE}") endif() endforeach() else() message(WARNING "No QML files found in ${QML_SOURCE_DIR} and its subdirectories") endif() # 在安装后运行 macdeployqt 以确保所有依赖项正确部署 if(QT_MACDEPLOYQT_EXECUTABLE) install(CODE " execute_process( COMMAND ${QT_MACDEPLOYQT_EXECUTABLE} \"\${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.app\" -always-overwrite -verbose=1 -qmldir=\"${QML_SOURCE_DIR}\" WORKING_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}\" RESULT_VARIABLE DEPLOY_RESULT ) if(NOT DEPLOY_RESULT EQUAL 0) message(WARNING \"macdeployqt failed with return code: \${DEPLOY_RESULT}\") else() message(STATUS \"macdeployqt completed successfully\") endif() ") endif() endif() # 安装规则 - 对于 macOS bundle if(APPLE) install(TARGETS ${PROJECT_NAME} BUNDLE DESTINATION . COMPONENT Runtime) endif() 这个是cmake文件,现在我用qt构建完成后,运行时提示 14:24:19: Starting /Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/MacOS/DTENApp... dyld[43125]: Library not loaded: @rpath/QtQuick.framework/Versions/A/QtQuick Referenced from: <547B041F-84D0-3E82-86DA-BDE25EE00048> /Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/MacOS/DTENApp-1.1.2.0729 Reason: tried: '/Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/code/DTENAPP/thirdpart/DTENLog/lib/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/code/DTENAPP/thirdpart/ChannelMgr/mac/lib/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQuick.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtWidgets.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtSql.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtMultimedia.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQmlMeta.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQmlWorkerScript.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQmlModels.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQml.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtOpenGL.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtNetwork.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtGui.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtCore.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/Frameworks/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/Frameworks/QtQuick.framework/Versions/A/QtQuick' (no such file) 14:24:19: The command "/Users/dten/Qt/Qt Creator.app/Contents/Resources/libexec/disclaim /Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/MacOS/DTENApp" terminated abnormally.
09-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值