简体   繁体   中英

Add subdirectory as a library to CMakeLists.txt

TLDR: I have two projects(Project A & B) using CMakeLists.txt, both build executables and they work separately. Now, I want to use Project A as a library in Project B, let's call this Project AB. How do I do it?

Current Directory Structures:

Project A

rootA
 |- bin
 |   |-
 |- build
 |   |-
 |- external-includes
 |- CMakeLists.txt with add_subdirectory(libraryA)
 |- libraryA
     |- main.cpp (uses library_A in an example program)
     |- library_A.cpp
     |- library_A.h
     |- Other .h and .cpp files library_A uses
     |- CMakeLists.txt having add_executable (library_A main.cpp library_A.cpp ....)

Project B

rootB
 |- bin
 |   |-
 |- build
 |   |-
 |- external-includes
 |- CMakeLists.txt with add_subdirectory(libraryB)
 |- libraryB
     |- main.cpp
     |- library_B.cpp
     |- library_B.h
     |- Other .h and .cpp files library_B uses
     |- CMakeLists.txt having add_executable (library_B main.cpp library_B.cpp ....)

Project AB

rootAB
 |- bin
 |   |-
 |- build
 |   |-
 |- external-includes
 |- rootA 
 |- CMakeLists.txt with add_subdirectory(libraryB)
 |- libraryB
     |- main.cpp
     |- library_B.cpp
     |- library_B.h
     |- Other .h and .cpp files library_B uses
     |- CMakeLists.txt having add_executable (library_B main.cpp library_B.cpp .....)

What I've tried so far:

I've tried adding include_directories(rootA/libraryA) and add_sudirectory(rootA) to rootAB/CMakeLists.txt and #include <library_A.h> to rootAB/libraryB/main.cpp, then it complains about linking errors(unresolved external symbol). If I add #include <library_A.cpp> , it will complain about other linking errors from library A, which don't occur if I build library_A separately. Probably what I want to do is to build library_A as a (static) library and link it in ProjectAB (preferably using current directory structure and modifications to CMakeLists.txt(s)). How to do so?

As done in this example, modify rootAB/rootA/libraryA/CMakelists.txt, replacing

add_executable (library_A main.cpp library_A.cpp ....)

with

add_library (library_A library_A.cpp ....)

and in rootAB/libraryB/CMakelists.txt, add

target_link_libraries(library_B library_A)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM