gpt4 book ai didi

c++ - cmake多库场景

转载 作者:行者123 更新时间:2023-11-28 03:46:01 25 4
gpt4 key购买 nike

我们想像这样组织一个C++项目:

project/
lib1/ (first library)
CMakeList.txt
src/
lib1.c
foo1.h
build/
test/ (tests)
CMakeList.txt
test1.c
test2.c
lib2/ (second library)
CMakeList.txt
src/
CMakeList.txt
os/ (OS dependent code)
CMakeList.txt
win32/
xxx.c (win32 implementation)
linux/
xxx.c (linux implementation)
lib2.c
foo2.h
build/
include/ (shared/public headers)
lib1/
lib.h (shared library header included from apps)
lib2/
lib.h (shared library header -"-)

请问,当 lib2 应该使用 link1 时,如何编写那些 CMakeLists.txt lib2 应该是可移植的(至少 Win32、Linux...)?

更正:如果某些 CMakeList.txt 文件不在它们的位置,请假设是这样。我可能忘记了。

最佳答案

整个理念是从整个项目的中央 CMakeLists.txt 开始。在这个级别上,所有目标(库、可执行文件)都将被聚合,因此例如从 lib1 链接到 lib2 不会有问题。如果 lib2 要链接到 lib1,则需要先构建 lib1。

平台特定的源文件应该有条件地设置为一些变量。(如果你需要在子目录中设置变量并在上面的目录中使用它,你必须将它设置到缓存中,使用 CACHE FORCE 等 - 请参见 set 手册)

这就是您正确进行源代码外构建的方式 - 正如 CMake 的意图:

cd project-build
cmake ../project

每个库都有单独的构建目录不是很 CMake'ish(如果我可以这么说)并且可能需要一些技巧。

project-build/
project/
CMakeLists.txt (whole project CMakeLists.txt)
[
project(MyAwesomeProject)

include_directories(include) # allow lib1 and lib2 to include lib1/lib.h and lib2/lib.h
add_subdirectory(lib1) # this adds target lib1
add_subdirectory(lib2) # this adds target lib2

]

lib1/ (first library)
CMakeList.txt
[
add_library(lib1...)
add_subdirectory(test)
]
src/
lib1.c
foo1.h
test/ (tests)
CMakeList.txt
test1.c
test2.c
lib2/ (second library)
CMakeList.txt
[
add_subdirectory(src)
]
src/
CMakeList.txt
[
if(WIN32)
set(lib2_os_sources os/win32/xxx.c)
elsif(LINUX)
set(lib2_os_sources os/linux/xxx.c)
else()
message(FATAL_ERROR "Unsupported OS")
endif()
add_library(lib2 SHARED lib2.c ${lib2_os_sources})
]
os/ (OS dependent code)
win32/
xxx.c (win32 implementation)
linux/
xxx.c (linux implementation)
lib2.c
foo2.h
include/ (shared/public headers)
lib1/
lib.h (shared library header included from apps)
lib2/
lib.h (shared library header -"-)

关于c++ - cmake多库场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7662583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com