我在 C++ 项目中的代码组织如下
- 我有几个
.cpp
和.h
包含我的课程的文件 - 我有几个
.cxx
文件必须针对.cpp
文件和一些外部库进行编译。
现在,每个 .cxx
文件都有一个 main()
方法,所以我需要为每个与文件同名的文件添加不同的可执行文件。
此外,这些 .cxx
文件可能不会链接到相同的外部库。
我想在 CMake 中编写这个构建,我是一个新手,我该怎么做?
原文由 ssb 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在 C++ 项目中的代码组织如下
.cpp
和 .h
包含我的课程的文件.cxx
文件必须针对 .cpp
文件和一些外部库进行编译。现在,每个 .cxx
文件都有一个 main()
方法,所以我需要为每个与文件同名的文件添加不同的可执行文件。
此外,这些 .cxx
文件可能不会链接到相同的外部库。
我想在 CMake 中编写这个构建,我是一个新手,我该怎么做?
原文由 ssb 发布,翻译遵循 CC BY-SA 4.0 许可协议
在组织具有多个示例文件的 OpenGL 项目时,我发现自己处于类似的情况,其中每个文件都包含一个 main 方法。
下面的设置将为每个 c/cpp 文件生成一个单独的可执行文件,并将所需的依赖项复制到目标 bin 文件夹。
文件夹结构
my-project
│── ch01_01.c
│── ch02_01.cpp
│── CMakeLists.txt
│── Resources
│ │── Libraries
│ │ │── glew
│ │ │ │── bin
│ │ │ │── include
│ │ │ │── lib
│ │ │── glfw
│ │ │ │── include
│ │ │ │── lib
CMakeLists.txt
cmake_minimum_required (VERSION 3.9)
project ("my-project")
include_directories(Resources/Libraries/glew/include
Resources/Libraries/glfw/include)
link_directories(Resources/Libraries/glew/lib
Resources/Libraries/glfw/lib)
link_libraries(opengl32.lib
glew32.lib
glfw3.lib)
set(CMAKE_EXE_LINKER_FLAGS "/NODEFAULTLIB:MSVCRT")
file(GLOB SOURCE_FILES *.c *.cpp)
foreach(SOURCE_PATH ${SOURCE_FILES})
get_filename_component(EXECUTABLE_NAME ${SOURCE_PATH} NAME_WE)
add_executable(${EXECUTABLE_NAME} ${SOURCE_PATH})
# Copy required DLLs to the target folder
add_custom_command(TARGET ${EXECUTABLE_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/Resources/Libraries/glew/bin/glew32.dll"
"${CMAKE_BINARY_DIR}/glew32.dll")
endforeach(SOURCE_PATH ${SOURCE_FILES})
可选步骤
在 Visual Studio 中
在开始窗口中使用“打开本地文件夹”选项打开项目
添加新文件时,您可以:
add_executable
到 CMakeLists.txtTools > Options > CMake
中的“为文件夹视图中的文件操作启用自动 CMake 脚本修改”选项来禁用此行为由于 CMakeLists.txt 永远不会更改,因此不会自动拾取新添加的文件,因此只需像这样重新生成缓存:
Project > CMake Cache (x64-Debug) > Delete Cache
Project > Generate Cache for my-project
现在您只需右键单击给定的 c/cpp 文件和 Set as Startup Item
即可使用 F5
对其进行调试。
环境
入门模板
如果您有兴趣,我将这个 入门模板 放在 GitHub 上。
原文由 rbento 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
我的建议是分两个阶段解决这个问题:
.cpp
和.h
文件构建一个库,使用add_library
.cxx
文件并使用add_executable
和foreach
从每个文件中创建一个可执行文件建立图书馆
这可能很简单
构建所有可执行文件
只需遍历所有 .cpp 文件并创建单独的可执行文件。
一些警告:
file( GLOB )
通常不推荐,因为如果添加新文件,CMake 不会自动重建。我在这里使用它,因为我不知道你的源文件。file(GLOB ...)
使用 RELATIVE 标志。string( REPLACE ... )
生成了测试名称。我可以将 get_filename_component 与NAME_WE
标志一起使用。关于“一般”CMake 信息,我建议您阅读 stackoverflow 上已经提出的一些广泛的“CMake 概述”问题。例如: