我有一个巨大的项目与2个主目录:-/myproject/src-/myproject/app策略是src在/myproject/lib目录中生成库,然后应用程序使用这些库在/myproject/bin目录中生成可执行文件。但是问题是:链接库的经典策略是使用FIND_LIBRARY(),但是如何链接一个还没有生成的库呢?谢谢
/myproject/src
/myproject/app
/myproject/lib
/myproject/bin
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会为你管理它。
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文件:
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)
型
# 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)
# 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 1和lib 2在依赖它们的可执行文件之前构建。输出文件分别放置在lib和bin目录中。
2条答案
按热度按时间2nc8po8w1#
find_library()比它的名字要多一点,它不仅找到一个(预安装的)lib的路径,而且通常还准备了很多变量和函数。此外,find_library()只适用于 * 特定 * 的库模块,这些模块位于cmake/share目录中。
当您构建自己的库时,必须使用add_library()命令将其添加到CMakeLists.txt中,该命令的工作方式与add_executable()命令完全相同。
当你完成了这一步,你就可以使用target_link_libraries()命令将库添加到可执行文件中。
总结一下:
字符串
你实际上不必知道或指定库文件的确切位置,cmake会为你管理它。
vsmadaxz2#
在CMake中,有一个**add_addition()**命令,你可以使用它来在你的项目中包含子目录的构建。使用这种方式,你可以确认库是在依赖于它们的可执行文件之前构建的。下面是一个基本的例子,你可以如何构建你的项目:
假设你的项目结构看起来像这样:
字符串
以下是如何设置CMakeLists.txt文件:
根级CMakeLists.txt(myproject/CMakeLists.txt)
型
src/CMakeLists.txt
型
app/CMakeLists.txt
型
此结构确认库lib 1和lib 2在依赖它们的可执行文件之前构建。输出文件分别放置在lib和bin目录中。