你可以按照以下方式修改根目录下的CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.12)
project(MyProject)
# 设置输出路径为 ./lib 和 ./bin
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
# 编译并生成动态库和静态库
file(GLOB SRC_SOURCES src/*.c)
foreach(SOURCE_FILE ${SRC_SOURCES})
# 获取源文件的名称(不包含扩展名)
get_filename_component(FILE_NAME ${SOURCE_FILE} NAME_WE)
# 生成动态库
add_library(${FILE_NAME}_shared SHARED ${SOURCE_FILE})
# 生成静态库
add_library(${FILE_NAME}_static STATIC ${SOURCE_FILE})
# 设置动态库和静态库的输出路径和名称为 ./lib/lib{FILENAME}.so 和 ./lib/lib{FILENAME}.a
set_target_properties(${FILE_NAME}_shared PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib")
set_target_properties(${FILE_NAME}_shared PROPERTIES LIBRARY_OUTPUT_NAME "${FILE_NAME}")
set_target_properties(${FILE_NAME}_static PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib")
set_target_properties(${FILE_NAME}_static PROPERTIES ARCHIVE_OUTPUT_NAME "${FILE_NAME}")
endforeach()
# 在 test 目录下编译生成可执行文件,并放置到 ./bin 目录下
add_subdirectory(test)
在根目录下创建一个名为 test/CMakeLists.txt
的文件,并添加以下内容:
# 设置测试文件所需的库和链接器
set(TEST_LIBS nty_coroutine_static nty_epoll_static) # 根据需要添加其他库文件,例如 nty_queue_static, nty_schedule_static, nty_socket_static等
# 编译并生成可执行文件
file(GLOB TEST_SOURCES test/*.c)
foreach(TEST_FILE ${TEST_SOURCES})
# 获取测试文件的名称(不包含扩展名)
get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE)
# 生成可执行文件
add_executable(${TEST_NAME} ${TEST_FILE})
# 设置可执行文件的输出路径为 ./bin
set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")
# 链接需要的库和依赖项,例如 pthread 库
target_link_libraries(${TEST_NAME} PRIVATE ${TEST_LIBS} pthread)
endforeach()
最后,在命令行中执行以下命令进行构建:
mkdir build && cd build # 创建一个 build 目录并进入其中
cmake .. # 在 build 目录下运行 cmake 命令,指向上级目录(包含 CMakeLists.txt 的目录)
make # 执行 make 命令进行编译构建
在成功完成构建之后,你会在 ./lib
目录下找到生成的动态库和静态库文件,它们的名称将与对应的源文件名一一对应。同时,在 ./bin
目录下会生成相应的可执行文件。这些可执行文件将链接所需的库文件,并在编译时包含 pthread 库。
内容由零声教学AI助手提供,问题来源于学员提问