cmake常用指令

本文详细介绍了CMake中设置可执行文件、静态库、动态库输出路径的方法,以及如何设置Debug和Release版本的后缀名。此外,还讲解了如何设置项目名称、链接库、可执行文件,并提供了安装目录的配置示例。同时,文章提到了在Linux环境下拷贝文件到目标目录的CMake技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cmake 输出路径
cmake 输出路径通常需要设置一下,这里记录一下:

1.设置可执行文件的输出路径:

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin)

2.静态库 lib 输出路径:

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../bin)

3.动态库输出路径(注意这个放在最后):

SET_TARGET_PROPERTIES(dllname PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../bin)

4.上面两条语句分别设置了Debug版本和Release版本下库文件的后缀名

set(CMAKE_DEBUG_POSTFIX "_d")    set(CMAKE_RELEASE_POSTFIX "_r") 

5.设置了Debug版本和Release版本下可执行文件的后缀名

set_target_properties(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "_d")     set_target_properties(${TARGET_NAME} PROPERTIES RELEASE_POSTFIX "_r")

6.设置项目名称:

PROJECT( name )

7.设置链接库名称:

target_link_libraries

例:

target_link_libraries(
                     DealWithMould
             ${VTK_LIBRARIES}
             )

target_link_libraries(myProject hello) 

7.可执行文件名,通过指定的源文件列表构建出可执行目标文件:

ADD_EXECUTABLE
ADD_EXECUTABLE(main main.cpp context.cpp patten.cpp patten.hpp )

8. 为生成的target配置安装目录

install(TARGETS MyLib
        EXPORT MyLibTargets 
        LIBRARY DESTINATION lib  # 动态库安装路径
        ARCHIVE DESTINATION lib  # 静态库安装路径
        RUNTIME DESTINATION bin  # 可执行文件安装路径
        PUBLIC_HEADER DESTINATION include  # 头文件安装路径
        )

LIBRARY, ARCHIVE, RUNTIME, PUBLIC_HEADER是可选的,可以根据需要进行选择。 DESTINATION后面的路径可以自行制定,根目录默认为CMAKE_INSTALL_PREFIX,可以试用set方法进行指定,如果使用默认值的话,Unix系统的默认值为 /usr/local, Windows的默认值为 c:/Program Files/${PROJECT_NAME}。比如字linux系统下若LIBRARY的安装路径指定为lib,即为/usr/local/lib。所以要安装mymath mymathapp我们可以这样写

当前目录

PROJECT_SOURCE_DIR:工程的根目录
 
PROJECT_BINARY_DIR:运行cmake命令的目录,通常为${PROJECT_SOURCE_DIR}/build
 
PROJECT_NAME:返回通过 project 命令定义的项目名称
 
CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径
 
CMAKE_CURRENT_BINARY_DIR:target 编译目录
 
CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路径
 
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
 
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置


安装拷贝

#设置变量
set(OPENCV_DLL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/OpenCV/bin)
# 设置输出目录
set(OUTPUT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeProjectTestDebug/")
set(EXECUTABLE_OUTPUT_PATH "${OUTPUT_PATH}/bin/")
set(LIBRARY_OUTPUT_PATH "${OUTPUT_PATH}/lib/")   
# 拷贝文件到exe所在的目录
# 1 拷贝文件夹里的文件
file(COPY ${OPENCV_DLL_DIR}/ DESTINATION ${EXECUTABLE_OUTPUT_PATH})
# 2 拷贝bin文件
file(COPY ${OPENCV_DLL_DIR} DESTINATION ${EXECUTABLE_OUTPUT_PATH})


file(COPY /opt/fs/lib/libfs.so DESTINATION lib libfs.so)

将所有符号链接和libfoo.so.1.2.3本身安装到lib中
也可以使用安装代替拷贝

install

install用于指定在安装时运行的规则。它可以用来安装很多内容,可以包括目标二进制、动态库、静态库以及文件、目录、脚本等:

install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])


一般复制或文件夹

install(DIRECTORY ${PROJECT_BINARY_DIR}/bin DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)

//将生成的文件夹下内容全部拷贝到,指定目标目录;

example:

#外面的cmake
cmake_minimum_required(VERSION 3.10)

project(plugins)

option(BUILD_UTESTS "Build tests." ON)

option(BUILD_PLUGINSTESTS "Build plugintests." ON)

# set utf-8
if(MSVC)
	if(MSVC_VERSION GREATER 1800)
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
	endif()
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()

if(APPLE)
add_compile_options(-std=c++11)
else()
endif()


#add_subdirectory(log)
add_subdirectory(messagebridge)


set_property(GLOBAL PROPERTY USE_FOLDERS ON)

if (BUILD_UTESTS)
	enable_testing()
	add_subdirectory(3rdparty/googletest1.10.0)
	set_property(TARGET "gmock" PROPERTY FOLDER "3rdparty")
	set_property(TARGET "gmock_main" PROPERTY FOLDER "3rdparty")
	set_property(TARGET "gtest" PROPERTY FOLDER "3rdparty")
	set_property(TARGET "gtest_main" PROPERTY FOLDER "3rdparty")
endif()

if (BUILD_PLUGINSTESTS)
    enable_testing()
    add_subdirectory(plugintests)
    set_property(TARGET "gmock" PROPERTY FOLDER "3rdparty")
	set_property(TARGET "gmock_main" PROPERTY FOLDER "3rdparty")
	set_property(TARGET "gtest" PROPERTY FOLDER "3rdparty")
	set_property(TARGET "gtest_main" PROPERTY FOLDER "3rdparty")
endif()

#里面的cmake

cmake_minimum_required(VERSION 3.10)

project(messagebridge)

include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("${str_cxx14}" _cpp_14_flag_supported)
if(_cpp_14_flag_supported)
   set(CMAKE_CXX_STANDARD 14)
endif()

if(WIN32)
        set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zi  /MT")
	set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /DEBUG /OPT:REF /OPT:ICF")
        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} /MTd" )
	set(CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} /MTd" )
	set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT" )
	set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi  /MT ")
	set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
	set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
elseif(UNIX)
        set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -g")
	set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} -g")
	set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g")
	set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -g")
endif()

set(NCP_ROOT ${NCP_ROOT} CACHE PATH "ncp root directory")

IF("${NCP_ROOT}" STREQUAL "")
	MESSAGE(FATAL_ERROR "Please set the NCP install path first. -DNCP_ROOT=XXXX ")
ENDIF()

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) 

if(WIN32)
	set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
elseif(UNIX)
	set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
endif()

add_subdirectory(messagebridge)
option(BUILD_UTESTS "Build tests." OFF)
if(BUILD_UTESTS)   
	add_subdirectory(utest)
endif()

#里面的cmake

cmake_minimum_required(VERSION 3.10)

project(messagebridge)

set(BOOST_DIR "" CACHE STRING INTERNAL)

Add_Definitions(-DPROPERTYTREE_EXPORT)

file(GLOB HEADER_FILES *.h *.hpp ../include/*.h)
file(GLOB SOURCE_FILES *.cpp)

include_directories("./" "../include/" "${NCP_ROOT}/include/ncp/" "${NCP_ROOT}/include/")

add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${HEADER_FILES})
target_link_libraries(${PROJECT_NAME} ${CMAKE_DL_LIBS})
if(WIN32)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ws2_32)
endif()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值