c++ 多文件


1. c++多文件

1.1. 使用g++ 命令

  1. -c生成.o文件,再进行-o链接
g++ -c a.cpp b.cpp
g++ a.o b.o -o test # 输出.exe名称为test
  1. 直接-o编译生成
g++ a.cpp b.cpp -o test
  1. 指定头文件位置 -i
g++ a.cpp b.cpp -o test -i include
target_link_libraries(myproject PRIVATE ${CMAKE_BINARY_DIR}/include)

1.2. 相关命令

1.2.1. -o优化级别

-o0 默认不优化
-o1 基本优化
-02 高级别优化
-03 最高级别优化
-os 优化代码大小
-ofast 开始所有-03优化

1.2.2. -g生成调试信息,配合gdb使用

-o0 -g 

cmake 关系:使用CMAKE_BUILD_TYPE 控制优化级别

Debug -o0 -g
Release -o2 或 -o3
RelWithDebInfo -o2 -g
MinSizeRel -os

1.2.3. 启用警告

  • -wall 启用常用警告
  • -Wextra 启用wall中没有的警告
  • -Werror所有警告视为错误,有警告就会编译失败

cmake 中

add_compile_options(-Wall -Wextra -Werror)

1.2.4. 语言标准

-std = c++11, 对标准进行选择

set(CAMEK_CXX_STANDARD 14) # 要求使用14
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制使用14
set(CMAKE_CXX_EXTENSIONS OFF) # 禁用GNU扩展

1.3. CMakeLists.txt示例

cmake_minimun_required(VERSION 3.10)

project(myproject , cxx) # 名称为myproject, 项目为c++ 项目

set(CMAKE_CXX_STANDARD 14) # 设置c++ 标准

target_include_directories(myproject PUBLIC "CMAKE_CURRENT_SOURCE_DIR"/include)# 引入头文件

add_compile_options(-Wall -Wextra -Werror) # 添加编译选项

add_executable(myproject 
	main.cpp
)

target_link_libraries(myproject PRIVATE library)

1.3.1. 编译方法

mkdir build
cd build
cmake .. -G "Ninja" / "Make" # 生成器的作用生成系统认识的命令,具有跨平台性
make

1.3.2. 添加库

1.3.2.1. 源文件

set(SOURCES  src/*)

add_executable(my_app ${SOURCES})
target_include_directories(my_app PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") # 为目标增加头文件搜索路径

1.3.2.2. 库文件

# 使用GLOB 获取文件
file(GLOB HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h") # GLOB 获取include下所有.h文件
set(HEADERS include/*)

# 定义库文件
add_library(mylib STATIC
	src/foo.cpp
	${HEADERS} # 库的头文件也放入库文件中,组成一个sub
)

target_include_directories(mylib PUBLIC
    "${CMAKE_CURRENT_SOURCE_DIR}/include"
)

# 将mylib 链接到 my_app
target_link_libraries(my_app PRIVATE mylib) 

1.3.2.3. 添加子目录

# 10. 添加子目录 (如果项目有多个 CMakeLists.txt 文件)
add_subdirectory(sub_project_dir)

1.3.2.4. 安装项目位置

install 的 安装路径为CMAKE_INSTALL_PREFIX,通常是软件下载位置,并不是项目所在路径

指定下载路径

cmake .. -DCMAKE_INSTALL_PREFIX = 下载路径

install(TARGETS my_app mylib
	RUNTIME DESTINATION bin
	ARCHIVE DESTINATION lib
	LIBRARY DESTINATION lib
)
install(DISTECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include"
	DESTINATION include
	FILES_MATCHING PATTERN "*.h"
)

1.3.3. 使用pybind11 创建python 库

  1. 创建calculator 库函数
# 创建calculator 库函数
add_library(MyCalculator STATIC 
	 src/calculator.cpp # 所有使用的cpp文件
)
target_include_directories(MyCalculator PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
  1. 创建cpp链接 c 库函数
add_executable(my_app src/main.cpp)
target_link_libraries(my_app PRIVATE myCalculator)
  1. 使用pybind11 创建python库
add_subdirectory(lib/pybind11) # 编译得到目标pybind11::module 库

add_library(python_module SHARED python_module.cpp)

# 为了查找calculator 
target_include_directories(my_python_module PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/src" # 需要 calculator.h
)

# 链接生成 my_python_module库 
target_link_libraries(my_python_module PRIVATE
    MyCalculator          # 链接我们自己定义的 C++ 库
    pybind11::module      # 链接 pybind11 提供的接口库
)

# 设置 Python 模块的输出名称和路径,使其符合 Python 的导入约定
set_target_properties(my_python_module PROPERTIES
	PREFIX ""`
	SUFFIX "${PYTHON_EXTENSION_SUFFIX}"
)

cmake_minimum_required(VERSION 3.10)
project(DBGindex1 VERSION 0.1 DESCRIPTION "A Hello World Project")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

file (GLOB_RECURSE SOURCE_FILES src/*.cpp) # 获取所有.cpp文件



# 查找 Python
find_package(Python3 COMPONENTS Development NumPy REQUIRED)

# This project will output an executable file
add_executable(${PROJECT_NAME} ${SOURCE_FILES})

# 添加pthread链接
target_link_libraries(${PROJECT_NAME} PRIVATE pthread)

# Create a simple configuration header
configure_file(config.h.in config.h)


# 将 pybind11 添加为子目录,创建一个pybind11::embed 或 pybind11::module 等接口库 
add_subdirectory(lib/pybind11)
# Include the configuration header in the build
target_include_directories(${PROJECT_NAME}
    PRIVATE
        "${PROJECT_BINARY_DIR}"
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
        ${Python3_INCLUDE_DIRS}
        ${Python3_NumPy_INCLUDE_DIRS}
        "${CMAKE_SOURCE_DIR}/third_party/pybind11/include"
        "/home/rose/soft/matplotlib-cpp/"
)


target_link_libraries(${PROJECT_NAME}
    PRIVATE
        pybind11::module
        ${Python3_LIBRARIES}
        ${Python3_NumPy_LIBRARIES}
)

文章作者: 小白菜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小白菜 !
评论
  目录