visual-studio - 为不同文件夹中的源创建静态库 .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 中创建一个。
如果我要向主解决方案添加一个新项目,那么处理这个问题的最佳方法是什么,并确保以后可以扩展?(我坚持使用这种代码设置,因为以前的开发人员以这种方式构建它。)
解决方案
为什么不在整个项目中使用 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)
推荐阅读
- php - 如何将显示的附加图像限制为仅显示一个?
- javascript - Duktape 有在 Linux 中执行外部程序的功能吗?
- javascript - 如何在反应中处理多个按钮单击,以知道单击了哪个
- react-native - 如何避免 AWS Amplify OAuth 尝试解析每个 oauth 进程
- request - 请求的客户端为空意味着什么?
- sql - 通过第一次使用特定产品进行分区
- java - org.springframework.mail.MailAuthenticationException:身份验证失败;嵌套异常是 javax.mail.AuthenticationFailedException: ;
- android - java.text.Normalizer 和 android.icu.text.Normalizer2 的区别
- c# - IQueryable 是否在每次访问对象时重新查询数据库?
- php - Grav CMS:在页面选择列表中隐藏模块化页面