首页 > 解决方案 > 为不同文件夹中的源创建静态库 .lib

问题描述

VS2015解决方案结构如下:

vs2015解决方案——

-Project-A(googletest源代码)
-Project-B

-Folder-1(带有源文件和头文件)
-Folder-2(带有 2 个子文件夹中的源文件和头文件)
-Folder-3(带有源文件和头文件)
-src(带有源文件)
-include(带有头文件文件)

-Project-C(单元测试)

我需要从所有来源构建一个静态库,Project-B并将这个静态库链接到Project-C. 我尝试仅将 CMake 用于Project-B,但无法使其正常工作。此外,这会projectB.sln在主 *.sln 中创建一个。

如果我要向主解决方案添加一个新项目,那么处理这个问题的最佳方法是什么,并确保以后可以扩展?(我坚持使用这种代码设置,因为以前的开发人员以这种方式构建它。)

标签: visual-studiocmakestatic-libraries

解决方案


为什么不在整个项目中使用 CMake?假设您的文件结构类似于 Visual Studio 解决方案资源管理器中显示的结构,它可能如下所示:

顶级 CMakeLists.txt:

cmake_minimum_required (VERSION 3.16)

# Name your VS solution.
project(MyProject)
enable_testing()

# Add the CMake file in the googletest repo
add_subdirectory(Project-A)
# Add the CMake file that configures your static library.
add_subdirectory(Project-B)
# Add the CMake file that configures your unit tests.
add_subdirectory(Project-C)

文件夹中的 CMakeLists.txt 文件Project-B

# Add the VS project for the static library.
project(MyLibProj)

add_library(MyLib STATIC)

# Add the public/private sources for the static library.
target_sources(MyLib 
    PUBLIC
      Folder-1/MyClass1.cpp
      Folder-1/MyClass2.cpp
      ...
      Folder-2/SubFolder1/UtilityClass1.cpp
      Folder-2/SubFolder1/UtilityClass2.cpp
      ...
      Folder-2/SubFolder2/HelperClass1.cpp
      ...
      Folder-3/Circle.cpp
      Folder-3/Square.cpp
    PRIVATE
      src/ImplClass1.cpp
      src/ImplClass2.cpp
      ...
)

# Add the include directories for the library.
target_include_directories(MyLib 
    PUBLIC 
      ${CMAKE_CURRENT_LIST_DIR}/Folder-1
      ${CMAKE_CURRENT_LIST_DIR}/Folder-2/SubFolder1
      ${CMAKE_CURRENT_LIST_DIR}/Folder-2/SubFolder2
      ${CMAKE_CURRENT_LIST_DIR}/Folder-3
    PRIVATE
      ${CMAKE_CURRENT_LIST_DIR}/include
)

文件夹中的 CMakeLists.txt 文件Project-C

# Add the VS project for the executable.
project(MyExeProj)

# Create the test executable, and link the static library to it.
add_executable(MyTestExe main.cpp)
target_link_libraries(MyTestExe PRIVATE MyLib)

add_test(NAME MyTest COMMAND MyTestExe)

推荐阅读