cmake3.0的使用

 参考:【公开课】现代CMake高级教程

https://www.bilibili.com/video/BV16P4y1g7MH/?vd_source=194db66f1a1ec19114918f47f37945aaicon-default.png?t=N7T8https://www.bilibili.com/video/BV16P4y1g7MH/?vd_source=194db66f1a1ec19114918f47f37945aa1、传统的 CMake 软件构建/安装方式

mkdir build # 先创建 build 目录
cd build    # 切换到 build 目录
cmake ..    # 在 build 目录运行 cmake <源码目录> 生成 Makefile
make -j4    # 调用本地的构建系统 make,开始真正的构建(4进程并行)
sudo make install # 让本地的构建系统执行安装步骤
cd ..       # 回到源码目录

2、现代CMake提供了更方便的 -B 和 --build 指令,不同平台,统一命令

cmake -B build # 在源码目录用 -B 直接创建 build 目录并生成 build/Makefile
cmake --build build -j4 # 自动调用本地的构建系统在 build 里构建,即:make -C build -j4
sudo cmake --build build --target install # 调用本地的构建系统执行 install 这个目标,即:安装

cmake -B build 免去了先创建 build 目录再切换进去再指定源码目录的麻烦。

cmake --build build 统一了不同平台(Linux 上会调用 make,Windows 上调用 devenv.exe)

结论:从现在开始,如果在命令行操作 cmake,请使用更方便的 -B--build 命令。

3、如果生成Release,在CMakeLists.txt中设置,Debug同理。

SET(CMAKE_BUILD_TYPE "Release")

4、cmake指定编译器,在CMakeLists.txt中设置。

set(CMAKE_C_COMPILER "/usr/local/bin/gcc")
set(CMAKE_CXX_COMPILER "/usr/local/bin/g++")

5、完整CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

project(Knowledge)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")  
    #VS的MSVC编译器C++版本命令,为了使用C++20标
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive- /Zc:__cplusplus")
    #找到Qt6包,为了下面使用Qt的cmake命令
    find_package(Qt6 REQUIRED COMPONENTS Quick Widgets)
else()
    #找到Qt6包,为了下面使用Qt的cmake命令
    #SET(CMAKE_BUILD_TYPE "Release")
    find_package(Qt6 REQUIRED COMPONENTS Quick Widgets)
endif()

#qt的cmake命令标准
qt_policy(SET QTP0001 NEW)
qt_standard_project_setup() 

#qt的cmake语法将文件加载到项目中
file(GLOB_RECURSE Header_FILES ${CMAKE_CURRENT_SOURCE_DIR}/HeaderFiles/*.h)
file(GLOB_RECURSE CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/SourceFiles/*.cpp)
file(GLOB_RECURSE EntityHeader_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Entity/*.h)
file(GLOB_RECURSE EntityCPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Entity/*.cpp)
file(GLOB_RECURSE SQLITECPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartySource/sqlite/source/*.c)
file(GLOB_RECURSE QML_FILES  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/QmlFiles/*.qml)
qt_add_executable(${PROJECT_NAME} SourceFiles/main.cpp)
qt_add_qml_module(${PROJECT_NAME}
    URI Knowledge
    VERSION 1.0
SOURCES ${Header_FILES} ${CPP_FILES} ${EntityHeader_FILES} ${EntityCPP_FILES} ${SQLITECPP_FILES}
QML_FILES ${QML_FILES})

#去除控制台
set_target_properties(${PROJECT_NAME} PROPERTIES
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Widgets Qt6::Quick)

#rttr
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartySource/rttr-master/src)
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
       file(GLOB rttr "${CMAKE_CURRENT_SOURCE_DIR}/lib/rttr/rttr_core_d.lib")
    else()
       file(GLOB rttr "${CMAKE_CURRENT_SOURCE_DIR}/lib/rttr/rttr_core.lib")
    endif()
    target_link_libraries(${PROJECT_NAME} PRIVATE ${rttr})
else()
    file(GLOB rttr "${CMAKE_CURRENT_SOURCE_DIR}/lib/rttr/librttr_core.dll.a")
    target_link_libraries(${PROJECT_NAME} PRIVATE ${rttr})
endif()

#sqlite
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartySource/sqlite/include)

#halcon
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartyInclude/halcon)
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    file(GLOB Halcon "${CMAKE_CURRENT_SOURCE_DIR}/lib/halcon/*.lib")
    target_link_libraries(${PROJECT_NAME} PRIVATE ${Halcon})
else()
endif()

#rapidjson
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartyInclude)

#opencv
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    set(opencv_world "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv/opencv_world460$<$<CONFIG:Debug>:d>.lib")
    target_link_libraries(${PROJECT_NAME} PRIVATE ${opencv_world})
else()
    file(GLOB opencv_world "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv/libopencv_world490.dll.a")
    target_link_libraries(${PROJECT_NAME} PRIVATE ${opencv_world})
endif()

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,确保你的项目已经正确地链接了 Emscripten SDK。接下来,在 CMakeLists.txt 中添加以下内容: ```cmake cmake_minimum_required(VERSION 3.0) project(your_project) # 设置编译选项 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 添加 Emscripten 编译器 SET(CMAKE_C_COMPILER "emcc") SET(CMAKE_CXX_COMPILER "em++") # 添加 Emscripten 编译选项 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1 -s USE_SDL=2 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3") # 添加源代码 add_executable(your_project main.cpp) # 导出 C 函数为 JavaScript 模块 set_target_properties(your_project PROPERTIES LINK_FLAGS "-s EXPORTED_FUNCTIONS='[\"_your_c_function\"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") # 指定输出文件名 set_target_properties(your_project PROPERTIES OUTPUT_NAME "your_project") # 指定输出文件类型为 JavaScript 模块 set_target_properties(your_project PROPERTIES SUFFIX ".js") # 拷贝输出文件到指定目录 add_custom_command(TARGET your_project POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:your_project> ${CMAKE_CURRENT_SOURCE_DIR}/output/) ``` 以上代码做了以下几件事: 1. 设置编译选项,包括编译标准、编译器等等。 2. 添加 Emscripten 编译器和编译选项。 3. 添加源代码。 4. 导出 C 函数为 JavaScript 模块,这里的 `_your_c_function` 是你需要导出的函数名。 5. 指定输出文件名为 `your_project.js`。 6. 拷贝输出文件到指定目录。 最后,你可以通过以下命令来生成 WebAssembly 项目: ```bash mkdir build && cd build cmake .. make ``` 如果一切顺利,你将得到 `your_project.js` 和 `your_project.wasm` 两个文件,其中前者是 JavaScript 模块,后者是 WebAssembly 模块。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值