cmake -- 让子目录使用自己的 Makefile

linux

1个回答

写回答

卟妖

2025-07-06 00:20

+ 关注

AI
AI

使用CMake构建项目是一个非常方便的方式,它可以帮助我们自动生成各种不同平台的Makefile文件。在CMake中,我们可以通过添加子目录来管理项目的不同部分。有时候,我们可能希望让子目录使用自己的Makefile文件,这样可以更好地组织项目结构和管理依赖关系。本文将介绍如何使用CMake让子目录使用自己的Makefile,并提供一个案例代码。

在CMake中,我们可以使用add_subdirectory命令将子目录添加到主项目中。当CMake处理到该命令时,它会进入到子目录中,并执行子目录中的CMakeLists.txt文件。在子目录的CMakeLists.txt文件中,我们可以使用自己的Makefile文件来构建子目录内的代码。

假设我们有一个主项目,其中包含两个子目录:lib和app。我们希望让lib子目录使用自己的Makefile文件来构建库文件,而app子目录使用主项目的Makefile文件来构建可执行文件。下面是一个示例的目录结构:

project/

CMakeLists.txt

mAIn.cpp

lib/

CMakeLists.txt

Makefile

source.cpp

header.h

app/

CMakeLists.txt

mAIn.cpp

首先,我们需要在主项目的CMakeLists.txt文件中添加子目录:

add_subdirectory(lib)

add_subdirectory(app)

然后,在lib子目录的CMakeLists.txt文件中,我们可以使用add_custom_target命令来执行Makefile文件:

add_custom_target(lib_build

COMMAND make

WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}

)

在上面的代码中,我们使用了add_custom_target命令来创建一个自定义目标,该目标执行make命令,并设置了工作目录为当前子目录的源代码目录。

接下来,在app子目录的CMakeLists.txt文件中,我们可以直接使用CMake提供的命令来构建可执行文件,而不需要使用Makefile文件:

add_executable(myapp mAIn.cpp)

target_link_libraries(myapp lib)

在上面的代码中,我们使用add_executable命令来创建一个可执行文件,并指定了主函数所在的源文件。然后,我们使用target_link_libraries命令来链接lib子目录中构建的库文件。

通过以上步骤,我们就可以使用CMake让子目录使用自己的Makefile文件来构建代码。这种方式可以更好地组织项目结构,并且使得不同部分的代码更易于管理和维护。

案例代码:

下面是一个简单的示例代码,演示了如何使用CMake让子目录使用自己的Makefile文件来构建代码。

主项目的CMakeLists.txt文件:

cmake

cmake_minimum_required(VERSION 3.10)

project(MyProject)

add_subdirectory(lib)

add_subdirectory(app)

lib子目录的CMakeLists.txt文件:

cmake

add_custom_target(lib_build

COMMAND make

WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}

)

app子目录的CMakeLists.txt文件:

cmake

add_executable(myapp mAIn.cpp)

target_link_libraries(myapp lib)

lib子目录的Makefile文件:

makefile

CC = gcc

CFLAGS = -Wall

lib: source.o

$(CC) $(CFLAGS) -shared -o lIBMylib.so source.o

source.o: source.c header.h

$(CC) $(CFLAGS) -c -fPIC source.c

clean:

rm -f *.o lIBMylib.so

app子目录的mAIn.cpp文件:

cpp

#include <IOStream>

#include "header.h"

int mAIn() {

std::cout << "Hello, World!" << std::endl;</p> std::cout << "Addition: " << add(2, 3) << std::endl;</p> return 0;

}

lib子目录的source.cpp文件:

cpp

#include "header.h"

int add(int a, int b) {

return a + b;

}

lib子目录的header.h文件:

cpp

#ifndef HEADER_H

#define HEADER_H

int add(int a, int b);

#endif

通过以上代码,我们可以看到lib子目录使用自己的Makefile文件来构建库文件,而app子目录使用主项目的Makefile文件来构建可执行文件。这样可以更好地组织和管理代码。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号