在cmake项目中使用静态库

using static libraries in cmake project

本文关键字:静态 cmake 项目      更新时间:2023-10-16

我有两个C++项目A和B。项目B依赖于项目A。项目A将此结构拆分为一些子目录:

Project A
|-inc
|  |-a1.h
|  |-a2.h
|-src
   |-CMakeLists.txt
   |-subdir_A1
   |  |-CMakeLists.txt
   |  |-a1.cpp
   |
   |-subdir_A2
      |-CMakeLists.txt
      |-a2.cpp
Project B
|-lib
   |-a1.h
   |-a2.h
   |-lib_ProjectA.a
|-src
   |-CMakeLists.txt
   |-b.cpp

问题是项目B无法解决项目A的定义。虽然我已经在项目B中将target_link_libraries添加到CMakeLists.txt中,但我有一个错误,如下所示:

对`project_a::a1::func1()"的未定义引用

UPD1

我通过从子目录(liba1.a,liba2.a)中复制所有库并将它们链接到项目中,成功地编译了项目B。我想知道是否可以调整项目A,这样我就只能使用一个文件lib_ProjectA.A

UPD2

代码:

项目A

add_library (adapter
   adapter.cpp
 )
target_link_libraries (adapter PUBLIC
   net  # From project's A subdirectory 
   utils # From project's A subdirectory 
)

项目B

add_library (anthill
   functional_block.cpp)
target_link_libraries(anthill 
  ${PROJECT_SOURCE_DIR}/lib/libjsoncpp.a
  ${PROJECT_SOURCE_DIR}/lib/libadapter.a 
  ${PROJECT_SOURCE_DIR}/lib/libnet.a     # Can't compile without it   
  ${PROJECT_SOURCE_DIR}/lib/libutils.a   # Can't compile without it
)

使用OBJECT选项的最佳解决方案:

 add_library(myObjects OBJECT a.c b.c)