CMake:链接一个已生成的库?

vs91vp4v  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(51)

我有一个巨大的项目与2个主目录:-/myproject/src-/myproject/app
策略是src在/myproject/lib目录中生成库,然后应用程序使用这些库在/myproject/bin目录中生成可执行文件。
但是问题是:链接库的经典策略是使用FIND_LIBRARY(),但是如何链接一个还没有生成的库呢?
谢谢

2nc8po8w

2nc8po8w1#

find_library()比它的名字要多一点,它不仅找到一个(预安装的)lib的路径,而且通常还准备了很多变量和函数。此外,find_library()只适用于 * 特定 * 的库模块,这些模块位于cmake/share目录中。
当您构建自己的库时,必须使用add_library()命令将其添加到CMakeLists.txt中,该命令的工作方式与add_executable()命令完全相同。
当你完成了这一步,你就可以使用target_link_libraries()命令将库添加到可执行文件中。
总结一下:

add_library(myLib libsourceA.c libSourceB.c)

add_executable(myProgram prgsourceA.c prgsourceB.c)
target_link_libraries(myProgram myLib)

字符串
你实际上不必知道或指定库文件的确切位置,cmake会为你管理它。

vsmadaxz

vsmadaxz2#

在CMake中,有一个**add_addition()**命令,你可以使用它来在你的项目中包含子目录的构建。使用这种方式,你可以确认库是在依赖于它们的可执行文件之前构建的。下面是一个基本的例子,你可以如何构建你的项目:
假设你的项目结构看起来像这样:

myproject/
|-- CMakeLists.txt
|-- src/
|   |-- CMakeLists.txt
|   |-- lib1/
|   |   |-- source files for lib1
|   |-- lib2/
|   |   |-- source files for lib2
|-- app/
|   |-- CMakeLists.txt
|   |-- app1/
|   |   |-- source files for app1
|   |-- app2/
|   |   |-- source files for app2
|-- lib/
|-- bin/

字符串
以下是如何设置CMakeLists.txt文件:

根级CMakeLists.txt(myproject/CMakeLists.txt)

cmake_minimum_required(VERSION 3.12)
project(MyProject)

# Add the source files directory for src
add_subdirectory(src)

# Add the source files directory for app
add_subdirectory(app)

src/CMakeLists.txt

# Add 1st library lib1
add_library(lib1 STATIC lib1/source_files.cpp)
target_include_directories(lib1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lib1)

# Add 2nd library lib2
add_library(lib2 STATIC lib2/source_files.cpp)
target_include_directories(lib2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lib2)

# Mention the output directory for libraries 
set(LIB_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../lib)

app/CMakeLists.txt

# Add executable name app1
add_executable(app1 app1/source_files.cpp)

# Link application app1 with librairies lib1 and lib2
target_link_libraries(app1 PRIVATE lib1 lib2)

# Mention the output directory for executables
set(EXEC_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../bin)

# Add executable app2
add_executable(app2 app2/source_files.cpp)

# Link application app2 with lib1 and lib2
target_link_libraries(app2 PRIVATE lib1 lib2)


此结构确认库lib 1lib 2在依赖它们的可执行文件之前构建。输出文件分别放置在libbin目录中。

相关问题