如何 CMake 将库编译为我的应用程序源代码的一部分而不是 static/shared 库?
How to CMake compile a library as part of my app's source and not as static/shared library?
我希望能够使用 VSCode 和 CLion 使用 CMake.
.
+-- lib
| +-- CMakeLists.txt
| +-- lib.c
| +-- lib.h
+-- app
| +-- CMakeLists.txt
| +-- app.c
| +-- app.h
举个例子,假设我想使用 {fmt} 库编译我的应用程序作为我的应用程序源代码的一部分,以便在我调试代码时查看 fmt 库代码库中的流程。
显然,我不想将 lib 的 cmake 文件的所有命令复制到我的应用程序的 cmake 文件中,一种将 lib 的 link CMakeLists.txt 的方法我的图书馆是最好的。
最后,我的应用程序使用了 static/shared 库,但已经有关于它的问题以及开源世界中的一些示例。
仅供参考,我的应用程序的源文件使用 #include <lib.h>
。
编辑:
我只是想澄清一点,使用 {fmt} 作为源代码要容易得多,因为它可以用作 仅包含头文件的库.
我认为 cmake 的 add_subdirectory
(https://cmake.org/cmake/help/latest/command/add_subdirectory.html) 完全可以满足您的需求。
它会将库的 CMakeLists.txt
包含到您的项目中,您可以在 target_link_libraries
.
等函数中自由使用它的目标
简单示例:假设您已将 fmt 源代码检出到 fmt 文件夹。
.
+-- fmt (fmt source code)
+-- CMakeLists.txt
+-- main.cpp
CMakeLists.txt:
cmake_minimum_required(VERSION 3.0)
project(example)
add_subdirectory(fmt)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC fmt)
main.cpp:
#include "fmt/core.h"
#include <iostream>
int main()
{
std::cout << fmt::format("The answer is {}.", 42) << std::endl;
}
如果您将带有调试信息的库编译成您 link 反对的静态库或共享库并且不移动源代码,我看不出您为什么不能将其作为一部分进行调试作为更大的应用程序。
如果您真的想“作为源代码的一部分”进行编译,您可以生成目标文件并将它们包含在您的主构建中——您可以使用
add_library(dummy OBJECT <source files>)
生成目标文件。但是我看不出你为什么要这样做。
总的来说,@luantkow 的回答似乎是满足您需要的正确方法。
我希望能够使用 VSCode 和 CLion 使用 CMake.
.
+-- lib
| +-- CMakeLists.txt
| +-- lib.c
| +-- lib.h
+-- app
| +-- CMakeLists.txt
| +-- app.c
| +-- app.h
举个例子,假设我想使用 {fmt} 库编译我的应用程序作为我的应用程序源代码的一部分,以便在我调试代码时查看 fmt 库代码库中的流程。
显然,我不想将 lib 的 cmake 文件的所有命令复制到我的应用程序的 cmake 文件中,一种将 lib 的 link CMakeLists.txt 的方法我的图书馆是最好的。
最后,我的应用程序使用了 static/shared 库,但已经有关于它的问题以及开源世界中的一些示例。
仅供参考,我的应用程序的源文件使用 #include <lib.h>
。
编辑:
我只是想澄清一点,使用 {fmt} 作为源代码要容易得多,因为它可以用作 仅包含头文件的库.
我认为 cmake 的 add_subdirectory
(https://cmake.org/cmake/help/latest/command/add_subdirectory.html) 完全可以满足您的需求。
它会将库的 CMakeLists.txt
包含到您的项目中,您可以在 target_link_libraries
.
简单示例:假设您已将 fmt 源代码检出到 fmt 文件夹。
.
+-- fmt (fmt source code)
+-- CMakeLists.txt
+-- main.cpp
CMakeLists.txt:
cmake_minimum_required(VERSION 3.0)
project(example)
add_subdirectory(fmt)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC fmt)
main.cpp:
#include "fmt/core.h"
#include <iostream>
int main()
{
std::cout << fmt::format("The answer is {}.", 42) << std::endl;
}
如果您将带有调试信息的库编译成您 link 反对的静态库或共享库并且不移动源代码,我看不出您为什么不能将其作为一部分进行调试作为更大的应用程序。
如果您真的想“作为源代码的一部分”进行编译,您可以生成目标文件并将它们包含在您的主构建中——您可以使用
add_library(dummy OBJECT <source files>)
生成目标文件。但是我看不出你为什么要这样做。
总的来说,@luantkow 的回答似乎是满足您需要的正确方法。